VC++调用PyRun_SimpleFile未执行Python文件(无报错)
VC++调用Python脚本无写入问题排查
问题描述
- 环境:VC++应用,Python 3.11,项目已完成配置,代码生成运行库设为Debug DLL
- 现象:编译无报错,
PyRun_SimpleFile返回值为0(标识运行成功),但encode_post.py未执行预期写入操作(打开test.txt并追加内容);手动双击或命令行运行该Python脚本可正常写入,C++调用时无任何写入结果 - Python脚本逻辑:仅实现打开
test.txt,追加命令行参数argv[1](也测试过不带参数的版本) - C++程序无报错、运行不中断
相关代码
char* argv[2]; argv[0] = "encode_post.py"; argv[1] = "Hello world"; try { Py_Initialize(); Py_SetProgramName((wchar_t*)argv[0]); PySys_SetArgv(2, (wchar_t**)argv); file = fopen(argv[0], "r"); if (file) { int result = PyRun_SimpleFile(file, argv[0]); fclose(file); } Py_Finalize(); } catch (IOException^ ex) { // Could not open the file }
排查与解决方向
文件路径差异
C程序的工作目录大概率和手动运行Python脚本时的目录不同,test.txt可能被生成到C程序的执行目录(比如项目的Debug/Release文件夹)而非你预期的位置。可以在Python脚本中加入代码验证当前工作目录:import os print(os.getcwd())或者直接在Python脚本中使用
test.txt的绝对路径,规避工作目录不一致的问题。字符类型转换错误
Py_SetProgramName和PySys_SetArgv要求传入宽字符(wchar_t*),直接将char*强制转换会导致Python识别异常。正确的转换方式如下:wchar_t wargv[2][256]; mbstowcs(wargv[0], argv[0], 256); mbstowcs(wargv[1], argv[1], 256); Py_SetProgramName(wargv[0]); PySys_SetArgv(2, wargv);Python错误未捕获
Python脚本的错误不会触发C异常,你代码中的catch (IOException^)无法捕获Python侧的错误。可以在C中调用PyErr_Print()打印Python的错误信息,排查脚本执行问题:if (file) { int result = PyRun_SimpleFile(file, argv[0]); if (result != 0) { PyErr_Print(); } fclose(file); }同时建议在
Py_Initialize()后检查初始化状态:if (!Py_IsInitialized()) { /* 处理初始化失败逻辑 */ }文件打开模式问题
显式指定文本模式打开Python脚本文件,避免Windows下的模式差异:file = fopen(argv[0], "rt");
内容的提问来源于stack exchange,提问作者Bilal
相关产品推荐
相关产品推荐

