【发布时间】:2015-02-21 09:38:58
【问题描述】:
我想使用来自 python 2.7.8 的给定 C++ 64 位共享库(linux 下的 .so 文件)中的函数。
C++共享库的The header有这个功能:
EXPORT_CODE double CONVENTION PropsSI(const char *Output, const char *Name1, double Prop1, const char *Name2, double Prop2, const char *Ref);
我需要一个不需要修改共享库的 C++ 代码的解决方案(一个完整的 Python 包装器已经与自定义库一起存在)。
这是基于以下答案的有效解决方案:
>>> import ctypes
>>> lib = ctypes.cdll.LoadLibrary("/PathTo/libCoolProp.so")
>>> PropsSI = lib.PropsSI
>>> PropsSI.argtypes = (ctypes.c_char_p, ctypes.c_char_p, ctypes.c_double, ctypes.c_char_p, ctypes.c_double, ctypes.c_char_p)
>>> PropsSI.restype = ctypes.c_double
>>> result = PropsSI(b"H", b"T", 300., b"P", 101325., ctypes.create_string_buffer("Water", 8))
>>> result
112654.89965373254
还有另一种写法:
>>> from ctypes import *
>>> CoolProp = cdll.LoadLibrary('/PathTo/libCoolProp.so')
>>> PropsSI = CoolProp.PropsSI
>>> PropsSI.restype = c_double
>>> print PropsSI(c_char_p("H"), c_char_p("T"),c_double(300.),c_char_p("P"),c_double(101325.),c_char_p("Water"))
112654.899654
【问题讨论】:
-
ctypes应该可以正常工作。函数的argtypes和restype你设置了吗?为什么不分享您如何在 python 中设置函数以及尝试调用它时发生了什么。 -
“寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。
-
@Dunes @Antii 我更新了问题。你是对的,这可能是
argtypes的更多问题。 -
我认为这是与 32 位和 64 位不同的约定的问题,但似乎不是。因此,该问题与stackoverflow.com/q/145270 重复
标签: python c++ python-2.7 64-bit shared-libraries