C/C++调用Python第三方库主要有以下两种方式,具体选择取决于项目需求:
一、通过Python C API直接调用
-
初始化与释放
使用
Py_Initialize()
初始化解释器,调用完毕后使用Py_Finalize()
释放资源。 -
动态加载模块
通过
PyImport_ImportModule()
加载第三方库(如ephem
),并使用PyObject_GetAttrString()
获取函数指针。 -
数据类型转换
使用
Py_BuildValue()
等函数将C/C++数据转换为Python对象,反之亦然。
示例代码 :
Py_Initialize();
PyRun_SimpleString("import ephem");
PyObject* pModule = PyImport_ImportModule("demo01");
PyObject* pFunc = PyObject_GetAttrString(pModule, "main");
// 调用函数并处理返回值
Py_Finalize();
二、通过预编译的C/C++绑定库调用
-
Cython/CSWIG
将Python代码编译为C/C++扩展模块(如
.so
或.dll
),直接在C/C++中调用,无需运行时解释器。 -
ctypes动态加载
使用标准库
ctypes
加载预编译的动态链接库(.dll
或.so
),通过函数指针调用Python函数。
示例代码(使用ctypes) :
typedef int (*AddFunc)(int, int);
AddFunc add = (AddFunc)dll.LoadLibrary("test.dll")->GetProcAddress("add");
int result = add(3, 4);
三、注意事项
-
路径配置 :需确保Python头文件、库文件及第三方库路径正确配置,避免链接错误。
-
环境管理 :使用虚拟环境时,可通过代码临时设置
PYTHONHOME
和PYTHONPATH
,避免影响全局环境。 -
性能优化 :预编译绑定库(如Cython/CSWIG)通常比直接调用Python C API更高效。
以上方法可根据项目复杂度、性能需求及开发环境灵活选择。