如何在不使用Python.h的前提下将Python变量传回C++程序
解决方案
不用Python.h的前提下,有3种常见的实现方式,按实现复杂度从低到高排列:
方案1:Python脚本输出结果到标准输出,C++通过popen捕获输出
这是改动最小的方案,不需要额外创建临时文件,直接把Python脚本里的结果用print输出到标准输出即可,C++侧把system换成popen读取管道内容:
- C++侧示例代码:
#include <cstdio> #include <string> #include <iostream> int main() { FILE* pipe = popen("python something.py", "r"); if (!pipe) { std::cerr << "调用Python脚本失败" << std::endl; return 1; } char buffer[128]; std::string result = ""; while (fgets(buffer, sizeof(buffer), pipe) != nullptr) { result += buffer; } pclose(pipe); // 这里result就是Python脚本输出的结果,自行解析即可 std::cout << "从Python拿到的结果:" << result << std::endl; return 0; }
- Python侧(something.py)示例代码:
# 你的处理逻辑 res = "这里是你要传回的结果,可以是数值、JSON字符串等" print(res) # 直接打印到标准输出即可,不要加其他多余的print内容
注意:如果要传结构化数据,可以把结果序列化为JSON字符串输出,C++侧再用JSON库解析即可
方案2:Python脚本把结果写入临时文件,C++读取文件内容
如果你不想修改原来的system调用逻辑,可以用中间文件做中转:
- C++侧先调用
system执行脚本,等脚本执行完成后读取约定好的临时文件内容:
#include <fstream> #include <string> #include <iostream> int main() { system("python something.py"); std::ifstream res_file("py_result.tmp"); if (!res_file.is_open()) { std::cerr << "读取结果文件失败" << std::endl; return 1; } std::string result((std::istreambuf_iterator<char>(res_file)), std::istreambuf_iterator<char>()); res_file.close(); // 用完可以删除临时文件 remove("py_result.tmp"); std::cout << "从Python拿到的结果:" << result << std::endl; return 0; }
- Python侧处理完成后把结果写入约定好的临时文件:
# 你的处理逻辑 res = "要传回的结果" with open("py_result.tmp", "w", encoding="utf-8") as f: f.write(res)
方案3:通过进程退出码传递小范围整数结果
如果要传的结果只是0-255范围内的整数,可以直接用Python脚本的退出码回传,C++侧直接拿system的返回值解析即可:
- C++侧示例:
#include <cstdlib> #include <iostream> int main() { int res_code = system("python something.py"); // 注意Windows和Linux下退出码解析逻辑略有不同,Linux下要右移8位拿实际退出码 #ifdef __linux__ res_code = WEXITSTATUS(res_code); #endif std::cout << "Python传回的整数结果:" << res_code << std::endl; return 0; }
- Python侧示例:
import sys # 你的处理逻辑,结果是0-255之间的整数 res = 123 sys.exit(res)
注意:这个方案仅适用于传递小范围整数,不适用字符串、浮点数等其他类型的数据
内容的提问来源于stack exchange,提问作者The Amateur Coder
相关产品推荐
相关产品推荐

