搜索
bottom↓
回复: 9

linux下用python调用c的动态链接库的问题

[复制链接]

出0入0汤圆

发表于 2014-3-8 11:16:36 | 显示全部楼层 |阅读模式
第一步:
第二步
第三部
第四部按F5执行


fun2调用的结果不对额

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入25汤圆

发表于 2014-3-8 12:29:41 | 显示全部楼层
lib.fun2.restype = ctypes.c_double 试试

出0入0汤圆

 楼主| 发表于 2014-3-10 16:50:54 | 显示全部楼层
墨非 发表于 2014-3-8 12:29
lib.fun2.restype = ctypes.c_double 试试

c_float c_double 报错,,说没有定义,我明明能调用ctypes,,为啥会出现未定义呢

出0入25汤圆

发表于 2014-3-10 16:57:49 | 显示全部楼层
熵之矢 发表于 2014-3-10 16:50
c_float c_double 报错,,说没有定义,我明明能调用ctypes,,为啥会出现未定义呢 ...

dir(ctypes)

看看ctypes模块定义有这几个标识符没?

出0入0汤圆

 楼主| 发表于 2014-3-10 19:37:47 | 显示全部楼层
墨非 发表于 2014-3-10 16:57
dir(ctypes)

看看ctypes模块定义有这几个标识符没?

在哪儿输入这句话?

出0入25汤圆

发表于 2014-3-10 21:04:55 | 显示全部楼层
window下 idle 里

import ctypes
dir(ctypes)

再看看 ctypes.__version__ 什么版本啊?

linux 终端 python 然后操作以上。
  1. >>> import ctypes
  2. >>> dir(ctypes)
  3. ['ARRAY', 'ArgumentError', 'Array', 'BigEndianStructure', 'CDLL', 'CFUNCTYPE', 'DEFAULT_MODE', 'DllCanUnloadNow', 'DllGetClassObject', 'FormatError', 'GetLastError', 'HRESULT', 'LibraryLoader', 'LittleEndianStructure', 'OleDLL', 'POINTER', 'PYFUNCTYPE', 'PyDLL', 'RTLD_GLOBAL', 'RTLD_LOCAL', 'SetPointerType', 'Structure', 'Union', 'WINFUNCTYPE', 'WinDLL', 'WinError', '_CFuncPtr', '_FUNCFLAG_CDECL', '_FUNCFLAG_PYTHONAPI', '_FUNCFLAG_STDCALL', '_FUNCFLAG_USE_ERRNO', '_FUNCFLAG_USE_LASTERROR', '_Pointer', '_SimpleCData', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__version__', '_c_functype_cache', '_calcsize', '_cast', '_cast_addr', '_check_HRESULT', '_check_size', '_ctypes_version', '_dlopen', '_endian', '_memmove_addr', '_memset_addr', '_os', '_pointer_type_cache', '_reset_cache', '_string_at', '_string_at_addr', '_sys', '_win_functype_cache', '_wstring_at', '_wstring_at_addr', 'addressof', 'alignment', 'byref', 'c_bool', 'c_buffer', 'c_byte', 'c_char', 'c_char_p', 'c_double', 'c_float', 'c_int', 'c_int16', 'c_int32', 'c_int64', 'c_int8', 'c_long', 'c_longdouble', 'c_longlong', 'c_short', 'c_size_t', 'c_ssize_t', 'c_ubyte', 'c_uint', 'c_uint16', 'c_uint32', 'c_uint64', 'c_uint8', 'c_ulong', 'c_ulonglong', 'c_ushort', 'c_void_p', 'c_voidp', 'c_wchar', 'c_wchar_p', 'cast', 'cdll', 'create_string_buffer', 'create_unicode_buffer', 'get_errno', 'get_last_error', 'memmove', 'memset', 'oledll', 'pointer', 'py_object', 'pydll', 'pythonapi', 'resize', 'set_conversion_mode', 'set_errno', 'set_last_error', 'sizeof', 'string_at', 'windll', 'wstring_at']
  4. >>> ctypes.__version__
  5. '1.1.0'
  6. >>>
复制代码


出0入0汤圆

发表于 2014-3-10 21:11:23 | 显示全部楼层
如果不是调用一个既有的没有源代码的历史遗留C库的话,
Python建议的使用C的方式Extending,参见官方文档:
http://docs.python.org/2/extending/extending.html

其实绝大部分C代码可以通过swig这个工具来自动封装成python的module,
直接在python代码里import,就像使用python原生的library一样。

出0入0汤圆

 楼主| 发表于 2014-3-10 22:17:56 | 显示全部楼层
墨非 发表于 2014-3-8 12:29
lib.fun2.restype = ctypes.c_double 试试

太感谢了,这次没问题了,是我少写了ctypes. 直接写了c_double,粗心了

出0入0汤圆

 楼主| 发表于 2014-3-10 22:19:02 | 显示全部楼层
li3p 发表于 2014-3-10 21:11
如果不是调用一个既有的没有源代码的历史遗留C库的话,
Python建议的使用C的方式Extending,参见官方文档: ...

嗯嗯,感谢分享~我去研究一下~

出0入0汤圆

 楼主| 发表于 2014-3-10 22:20:12 | 显示全部楼层
熵之矢 发表于 2014-3-10 22:17
太感谢了,这次没问题了,是我少写了ctypes. 直接写了c_double,粗心了

只是还有一个小问题,在test.c里面有print 但是我的idle界面没有任何字符输出来,这个怎么解决呢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 20:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表