【问题标题】:Error while calling python via std::system通过 std::system 调用 python 时出错
【发布时间】:2020-03-15 04:08:21
【问题描述】:

当我尝试使用 c++ 调用 python 时:

QString command = "cd C:\\python\\python37 && python C:\\projects\\file_editor.py" 
QByteArray ba = command.toLocal8Bit();
const char *c_str2 = ba.data();
std::system(c_str2)

我收到此错误:

Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

任何想法如何解决这个问题?

编辑: 我在 PATH 变量中的 python 相关路径是:

C:\python\python37\Scripts

我可以使用 Qt 我也试过这个:

QProcess process;
QStringList pythonCommandArguments = QStringList() << "C:\\projects\\file_editor.py"
process.start("python", pythonCommandArguments);

然后我得到这个错误:

QProcess: Destroyed while process ("python") is still running.

【问题讨论】:

  • std::system(const('cd C:\python\python37 &amp;&amp; python.exe C:\projects\file_editor.py')) 不是有效的 C++ 代码。
  • @Lua,你确定吗? \f 是一个有效的转义字符,我想知道您为什么要痛苦地将 / 替换为 `\`。
  • 这看起来像是 Python 错误,与 C++ 无关。
  • 如果你这样做 std::system("cd C:\\python\\python37 &amp;&amp; python C:\\projects\\file_editor" ) 你会得到错误吗?
  • @Lua 我知道,但要调试问题,这是过程的一部分。将您的代码更改为 std::system("cd C:\\python\\python37 &amp;&amp; python C:\\projects\\file_editor"); 并查看您是否收到错误。如果你不这样做,那么你就知道你的字符串格式不正确。

标签: python c++ qt cmd std


【解决方案1】:

如果您有类似的问题,那么您有 2 个选择:

  • 将 [user]\python[version]\ 添加到路径

  • 或像@matthijs990 所说的将.exe 与python 安装一起放在磁盘上

【讨论】:

    【解决方案2】:

    目标:

    在 c++ 中执行 python 脚本

    问题:

    使用system或QProcess会报错

    解决方案:

    我认为问题在于,当您从其他驱动器调用 python 时,它无法找到该模块,因此请尝试将您的程序与 python 放在同一驱动器上,它会起作用。

    示例:

    这是一个简单的示例,您的文件树可能意味着什么

    - pc
        - D
            [...]
            - myqtproject
                - source code
                - bin
        - C
            [...]
            python37
    

    那么这是错误的,因为python现在找不到他的任何库,因为它在另一个驱动器上,所以你需要将你的qt项目放在C盘上,它看起来像这样:

    - pc
        - C
            - projects
                - myqtproject
                    - source code
                    - bin
            [...]
            python37
        - D
            [...]
    

    你需要更换 process.start("python", pythonCommandArguments);process.startDetached("python", pythonCommandArguments); 这将起作用

    【讨论】:

    • 这很好用。我仍然不明白为什么它不应该工作。驱动器名称可以是 PATH 或 PYTHONPATH 的一部分。也许 C:\...\python37 上存在读取权限问题?这让我很好奇。
    • 使用不同的磁盘总是会让人困惑,即使我不知道为什么,但我知道它在那里
    【解决方案3】:

    无需cd进入python解释器目录

    另一方面,许多项目(如果没有很好地编码)可能需要您 cd 进入项目目录。

    如果编码很好,根本不需要 cd

    我还会使用 py.exe 包装器,它安装在要选择的 windows 下 正确的可执行文件,并且可能还会处理一些环境变量。 如果您安装了多个 python 版本,我可以向您展示如何使用 py.exe 选择正确的版本。

    尝试以下两个选项:

    QString command = "py.exe C:\\projects\\file_editor.py"
    
    QString command = "cd C:\\projects && py.exe C:\\projects\\file_editor.py"
    

    如果你有编码问题,那么设置环境变量 PYTHONIOENCODINGputenv() 到您想要的编码 'utf-8' / 'cp1252' 或任何你喜欢的。

    我建议你先从 cmd 行尝试,只有当你从那里开始工作时,你才能从 C++ 尝试它

    例子:

    cd c:\projects
    echo just some_text > stdin.txt
    set PYTHONIOENCODING=cp1252
    type stdin.txt | py.exe C:\projects\file_editor.py
    

    我使用 type stdin.txt | py.exe ... 技巧,这样我就可以模拟调用 python 而无需连接到控制台。

    我没有安装 C++ 的 Windows PC,所以我无法测试。但希望这(使用 py.exe 并明确设置 PYTHONIOENCODING)应该让你走上正轨

    【讨论】:

    • 在控制台中它可以工作(它已经准备好了)但在我的 c++ 程序中它没有
    • 它是否在控制台中使用我在回答中建议的 exact 命令工作?
    • 好的,你用 putenv() 用 py.exe 尝试过 C++?你仍然得到完全相同的错误?
    • 如果您在没有set PYTHONIOENCODING=cp1252 行的cmd 中尝试我的示例,您会收到错误消息吗?
    • 如果没有 set pythonioencoding 命令,我不会在 cmd 中得到错误
    猜你喜欢
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多