c++可通过python C api调用Python脚本,需配置Python开发环境并链接库文件,使用Py_Initialize初始化解释器,PyRun_SimpleString执行代码,PyImport_ImportModule导入模块,PyObject_GetAttrString获取函数,PyObject_CallFunction传参调用,最后Py_Finalize关闭解释器,注意引用计数、异常处理与路径设置。

在C++中调用Python脚本,可以借助Python官方提供的C API来实现。这种方法允许你在C++程序中嵌入Python解释器,从而执行Python代码、调用函数、传递参数和获取返回值。以下是具体使用方法和步骤。
1. 环境准备与配置
要让C++调用Python,需要确保以下几点:
例如,在linux下安装Python开发包:
立即学习“Python免费学习笔记(深入)”;
sudo apt-get install python3-dev
编译时需链接Python库:
g++ main.cpp -o main -I/usr/include/python3.x -lpython3.x
2. 基本调用流程
使用Python C API的基本步骤如下:
- 初始化Python解释器
- 执行Python代码或加载脚本
- 调用python函数并处理参数和返回值
- 结束时释放资源
示例代码:
#include <Python.h> #include <iostream> <p>int main() { // 初始化Python解释器 Py_Initialize();</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">if (!Py_IsInitialized()) { std::cerr << "Failed to initialize Python" << std::endl; return -1; } // 执行一个简单的Python语句 PyRun_SimpleString("print('Hello from Python!')"); // 执行外部Python脚本 FILE* fp = fopen("script.py", "r"); if (fp) { PyRun_SimpleFile(fp, "script.py"); fclose(fp); } else { std::cerr << "Cannot open script.py" << std::endl; } // 关闭Python解释器 Py_Finalize(); return 0;
}
3. 调用Python函数并传参
更常见的需求是从C++调用Python脚本中的特定函数,并传递参数。
假设有一个 script.py 文件:
def add(a, b): return a + b <p>def greet(name): print(f"Hello, {name}")
C++中调用这些函数的方法:
PyObject *pModule = PyImport_ImportModule("script"); // 导入模块 if (!pModule) { PyErr_Print(); std::cerr << "Can't find script.py" << std::endl; return -1; } <p>// 调用 greet 函数 PyObject *pFunc = PyObject_GetAttrString(pModule, "greet"); if (PyCallable_Check(pFunc)) { PyObject_CallFunction(pFunc, "s", "World"); // 传字符串参数 }</p><p>// 调用 add 函数 PyObject <em>pAdd = PyObject_GetAttrString(pModule, "add"); if (PyCallable_Check(pAdd)) { PyObject </em>pResult = PyObject_CallFunction(pAdd, "ii", 3, 4); // 传两个整数 if (pResult) { long result = PyLong_AsLong(pResult); std::cout << "3 + 4 = " << result << std::endl; Py_DECREF(pResult); } }
4. 注意事项与常见问题
实际使用中需要注意以下几点:
- 引用计数:Python C API使用引用计数管理内存,每次获取对象后记得适当增加或减少引用,避免内存泄漏
- 异常处理:调用失败时使用 PyErr_Print() 查看错误信息
- 多线程支持:若涉及多线程,需调用 PyEval_InitThreads() 并管理GIL(全局解释器锁)
- 路径问题:确保Python能正确导入脚本,必要时通过 PyRun_SimpleString(“import sys; sys.path.append(‘.’)” ) 添加路径
基本上就这些。只要配置好环境,C++调用Python脚本并不复杂,但要注意类型转换和资源管理细节。


