通过 std::system 调用 python 时出错

Error while calling python via std::system

当我尝试在 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.

不需要 cd 进入 python 解释器的目录。

另一方面,许多项目(如果编码不当)可能需要您 cd 进入项目目录。

如果编码得当,根本不需要 cd

我还会使用 py.exe 包装器,它安装在 windows 下,目的是选择 正确的可执行文件,也可能会处理一些环境变量。 如果您安装了多个 python 版本,我可以向您展示如何 select 使用 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 而无需连接到控制台。

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

目标:

在 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); 这会起作用

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

  • 添加[用户]\python[版本]\到路径

  • 或者像 @matthijs990 所说的那样将 .exe 放在磁盘上 python 安装