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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:15:07