如何通过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
相关产品推荐
相关产品推荐

