将第三方共享库与 Python ctypes 集成

Posted

技术标签:

【中文标题】将第三方共享库与 Python ctypes 集成【英文标题】:Integrating thirt-party shared library with Python ctypes 【发布时间】:2017-05-08 12:35:15 【问题描述】:

我需要编写一个 Python 程序来调用一些函数并从第三方共享库中获取 JSON 响应(一个 unicode 字符串)。大概该库是用 C++ 编写的。该库有一个包含以下内容的头文件:

#include <string>
#include <ExportLib.h>
// some code ignored here
typedef std::string UString;
using namespace std;
namespace ns1
class DLL_PUBLIC S_API 
public:
static UString function1();
static UString function2();
// some code ignored here
;

这是我用 Python 写的(2.7 和 3.x 都试过):

from ctypes import *
lib1 = CDLL('lib1.so')
func1 = lib1.function1
func1.restype = c_wchar_p
result = func1()
print(result)

但代码不是显示 JSON,而是显示问号。我确实尝试了以下操作,但出现了段错误:

func1.restype = POINTER(c_wchar_p)
result = func1()
result1 = wstring_at(result)

请指出正确的方向,因为我不是一个很好的程序员

UPD:忘了说,我正在使用 Linux 系统。 UPD2:为了解决这个需要使用 Cython,感谢 erykson

【问题讨论】:

它是否提供 C API?如果不是这样,您最好使用诸如 Cython 之类的编译接口,IIRC 确实可以与 C++ 库一起使用。 ctypes 仅适用于使用标准 C 数据类型和调用约定的库,不适用于 std::string 等 C++ 类型。 @eryksun,不,它没有任何 C API。我确实尝试过 Cython,得到了类似的结果。我应该在这篇文章中提及它还是放弃这篇文章并创建一个新的描述我的 Cython 尝试? 我会专注于让它与 Cython 一起工作。 ctypes 不会有帮助,如果不使用已编译的 C 适配器接口包装 C++ 库也是如此。如果需要编译器,不妨使用 Cython。 谢谢,我会试试 Cython。 【参考方案1】:

感谢 eryksun,我发现无法将 ctypes 与 C++ 数据类型一起使用。打算用 Cython 来解决这个问题。

【讨论】:

以上是关于将第三方共享库与 Python ctypes 集成的主要内容,如果未能解决你的问题,请参考以下文章

Python Cookbook(第3版)中文版:15.1 使用ctypes访问C代码

编译共享库时出现链接错误

Python标准库与第三方库详解(转载)

分配给通过 Python CTypes 从共享库导出的变量?

使用预编译的C共享库与JNI / NDK

在 Python ctypes 中加载共享库期间出现分段错误(核心转储)