You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python.h在C++中向Python传递变量?

在嵌入的Python中使用C++变量的正确方法

问题分析

你原来的代码直接尝试将C变量与字符串拼接后传给PyRun_SimpleString,这会因类型不匹配导致编译错误——C不支持字符串字面量与int/char直接相加。

解决方法

方法一:构造合法的Python代码字符串

把C++变量转换成字符串后,拼接成完整的Python语句,再传给PyRun_SimpleString:

处理整数变量

#include <string>
// 初始化Python环境的代码已省略

int num = 43;
// 将int转为字符串,拼接成print语句
std::string python_code = "print(" + std::to_string(num) + ")";
PyRun_SimpleString(python_code.c_str());

处理字符变量

注意要给Python中的字符加上单引号,避免语法错误:

#include <string>
// 初始化Python环境的代码已省略

char g;
std::cin >> g;
// 将char转为字符串并包裹单引号
std::string python_code = "print('" + std::string(1, g) + "')";
PyRun_SimpleString(python_code.c_str());

方法二:用Python C API注册全局变量(更规范)

通过API将C++变量转为Python对象,注册到Python的全局命名空间,再直接在Python代码中使用变量名:

处理整数变量

// 初始化Python环境的代码已省略

int num = 43;
// 将C++ int转为Python整数对象
PyObject* py_num = PyLong_FromLong(num);
// 获取__main__模块的全局字典
PyObject* main_module = PyImport_AddModule("__main__");
PyObject* global_dict = PyModule_GetDict(main_module);
// 将变量注册为Python全局变量"num"
PyDict_SetItemString(global_dict, "num", py_num);
// 执行Python打印语句
PyRun_SimpleString("print(num)");
// 释放Python对象,避免内存泄漏
Py_DECREF(py_num);

处理字符变量

// 初始化Python环境的代码已省略

char g;
std::cin >> g;
// 将C++ char转为Python字符串对象
PyObject* py_g = PyUnicode_FromStringAndSize(&g, 1);
PyObject* main_module = PyImport_AddModule("__main__");
PyObject* global_dict = PyModule_GetDict(main_module);
PyDict_SetItemString(global_dict, "g", py_g);
PyRun_SimpleString("print(g)");
Py_DECREF(py_g);

这种方式更适合复杂场景(比如传递字符串、浮点数或自定义对象),也避免了字符串拼接可能带来的语法错误。

内容的提问来源于stack exchange,提问作者user20342224

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:50:30