Python脚本必须用sys.argv接收C++传入的命令行参数,不能用input()或配置文件;C++需通过启动新进程(如popen)调用Python,注意路径、引号、编码、超时及环境一致性。

Python脚本必须用 sys.argv 接收参数,C++ 传参本质是启动新进程
不是“调用函数”,而是让 C++ 启动一个 Python 进程并把参数塞进命令行。所以 Python 端不能靠 input() 或配置文件——得老老实实读 sys.argv。
常见错误是 Python 脚本里写 sys.argv[0] 就停了,漏掉后面的参数;或者没加 if __name__ == "__main__":,导致导入时就执行逻辑。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- Python 脚本开头加
import sys,用sys.argv[1:]拿参数(argv[0]是脚本路径) - C++ 用
std::system()最简单,但无法捕获输出;想拿返回值或 stdout,得用popen()或更底层的fork()/exec() - 参数含空格或特殊字符时,C++ 里必须手动加引号,比如拼成
"python3 script.py \"hello world\" 42",否则 shell 会拆开
popen() 能读 Python 输出,但 Windows 和 Linux 路径/命令名不同
Linux 下常用 popen("python3 script.py arg1 arg2", "r"),Windows 得写 popen("python script.py arg1 arg2", "r")——因为默认没装 python3 命令,且 Python 安装路径可能不在 PATH 里。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 别硬编码
python或python3,优先查环境变量PYTHONPATH,或让用户传 Python 解释器路径 -
popen()返回的是FILE*,用fgets()逐行读,别用fread()盲读——Python 脚本若没 flush,输出可能卡住 - Windows 上
popen()不支持双向通信(不能同时读写),要交互必须换_popen()或用管道 +CreateProcess()
参数太多或含二进制数据?改用标准输入传参,避免 shell 解析污染
当参数是 JSON、base64 或路径含大量反斜杠时,命令行传参极易出错。这时候让 Python 从 stdin 读,C++ 把数据写进去更可靠。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- Python 端用
sys.stdin.read()或json.load(sys.stdin);记得在 C++ 写完后fclose()触发 EOF - C++ 用
popen("python3 script.py", "w")获取写入句柄,然后fputs()发送数据 - 别忘了设超时:Python 脚本若卡死(比如等用户输入),C++ 会永久阻塞;Linux 可用
alarm(),Windows 得用线程 +WaitForSingleObject()
嵌入 Python 解释器(Py_Initialize())看似高级,实际多数项目没必要
真要用 PyRun_SimpleString() 或 PyObject_CallObject(),得链接 libpython,处理引用计数,还要保证 C++ 和 Python 的 ABI 兼容(比如都是用 GCC 编译、同一版本的 Python)。CI 构建、多平台分发时容易崩。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 仅当 Python 脚本需高频调用(每秒上百次)、且参数/返回极轻量时才考虑嵌入;否则进程启动开销可忽略(现代 SSD + Python 启动约 10–50ms)
- 嵌入方式下,
PySys_SetArgv()设置参数,但argv[0]必须是真实存在的路径,否则__file__为空,相对导入失效 - Windows 上 DLL 路径问题最头疼:确保
pythonXX.dll在PATH里,且和 C++ 程序位数一致(x64 程序不能加载 x86 的 Python DLL)
跨语言传参真正的复杂点不在语法,而在环境一致性——Python 版本、模块是否安装、编码是否为 UTF-8、临时目录权限、甚至 SELinux 策略都可能让同一段代码在开发机跑通、上线就挂。










