首页 > 后端开发 > C++ > 正文

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

裘德小鎮的故事
发布: 2025-12-13 07:17:33
原创
769人浏览过
C++调用Python脚本需嵌入Python解释器,核心步骤为初始化、执行、获取变量、清理;须链接Python库、注意路径与异常处理,多线程需GIL管理,轻量场景可选system调用。

c++如何调用python脚本?(代码示例)

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

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

确保你的编译环境已安装Python开发包(如Ubuntu下装python3-dev,Windows下需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。

以上就是C++如何调用Python脚本?(代码示例)的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号