熵之矢 发表于 2014-3-8 11:16:36

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

第一步:
第二步
第三部
第四部按F5执行


fun2调用的结果不对额

墨非 发表于 2014-3-8 12:29:41

lib.fun2.restype = ctypes.c_double 试试

熵之矢 发表于 2014-3-10 16:50:54

墨非 发表于 2014-3-8 12:29
lib.fun2.restype = ctypes.c_double 试试

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

墨非 发表于 2014-3-10 16:57:49

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

dir(ctypes)

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

熵之矢 发表于 2014-3-10 19:37:47

墨非 发表于 2014-3-10 16:57
dir(ctypes)

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

在哪儿输入这句话?

墨非 发表于 2014-3-10 21:04:55

window下 idle 里

import ctypes
dir(ctypes)

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

linux 终端 python 然后操作以上。
>>> import ctypes
>>> dir(ctypes)
['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']
>>> ctypes.__version__
'1.1.0'
>>>

li3p 发表于 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一样。

熵之矢 发表于 2014-3-10 22:17:56

墨非 发表于 2014-3-8 12:29
lib.fun2.restype = ctypes.c_double 试试

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

熵之矢 发表于 2014-3-10 22:19:02

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

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

熵之矢 发表于 2014-3-10 22:20:12

熵之矢 发表于 2014-3-10 22:17
太感谢了,这次没问题了,是我少写了ctypes. 直接写了c_double,粗心了

只是还有一个小问题,在test.c里面有print 但是我的idle界面没有任何字符输出来,这个怎么解决呢
页: [1]
查看完整版本: linux下用python调用c的动态链接库的问题