C++如何调用Python脚本?(代码示例)

6次阅读

c++调用python脚本需嵌入Python解释器,核心步骤为初始化、执行、获取变量、清理;须链接Python库、注意路径与异常处理,线程需GIL管理,轻量场景可选system调用。

C++如何调用Python脚本?(代码示例)

在C++中调用python脚本,核心是使用Python官方提供的C API(即Python.h),通过嵌入Python解释器来执行脚本。关键步骤包括:初始化解释器、加载脚本、运行代码、处理返回值、最后清理资源。下面给出一个简洁、可运行的示例,并说明注意事项。

准备工作:链接Python库并包含头文件

确保你的编译环境已安装Python开发包(如ubuntu下装python3-devwindows下需Python对应版本的libsinclude目录)。编译时要链接Python库,例如:

g++ main.cpp -o main `python3-config –includes –ldflags`

基础调用:执行一个简单Python脚本文件

假设你有一个hello.py

立即学习Python免费学习笔记(深入)”;

print(“Hello from Python!”)
result = 42 + 10

对应的C++代码如下:

#include #include iostream>

int main() {
  Py_Initialize(); // 初始化Python解释器

  // 执行Python脚本文件
  int ret = PyRun_SimpleString(“exec(open(‘hello.py’).read())”);
  if (ret == 0) {
    std::cout   } else {
    std::cout   }

  Py_Finalize(); // 清理资源
  return 0;
}

进阶用法:获取Python脚本中的变量值

如果想从C++里读取Python脚本里定义的变量(比如上面的result),需要用Python C API操作全局命名空间

#include #include stream>

int main() {
  Py_Initialize();

  // 执行脚本
  PyObject* pModule = PyImport_AddModule(“__main__”);
  PyObject* pDict = PyModule_GetDict(pModule);
  PyRun_String(“exec(open(‘hello.py’).read())”, Py_file_input, pDict, pDict);

  // 获取变量 result
  PyObject* pResult = PyDict_GetItemString(pDict, “result”);
  if (pResult && PyLong_Check(pResult)) {
    long value = PyLong_AsLong(pResult);
    std::cout   }

  Py_Finalize();
  return 0;
}

常见问题与建议

路径问题:Python脚本路径是相对于C++程序运行时的当前工作目录,不是源码目录。推荐用绝对路径或提前设置PySys_SetArgvsys.path

异常处理PyRun_String出错时不会自动打印异常,可用PyErr_print()捕获并输出错误信息。

线程安全:多线程调用需调用PyEval_InitThreads()(Python 3.7+ 已默认初始化)、加GIL锁(PyGILState_Ensure() / PyGILState_Release())。

替代方案:若只是偶尔调用脚本且不追求性能,也可用std::system("python3 script.py")启动子进程——更简单,但无法共享变量、无实时交互。

基本上就这些。嵌入Python解释器功能强大,但也带来依赖和生命周期管理负担。小项目用子进程更轻量;需要深度交互时再上C API。

text=ZqhQzanResources