在 Qt 中运行 .py 脚本

Posted

技术标签:

【中文标题】在 Qt 中运行 .py 脚本【英文标题】:Run .py script in Qt 【发布时间】:2019-07-02 09:16:25 【问题描述】:

我想运行(点击按钮后)一个 .py 脚本

我已经尝试过以下代码

    QProcess p;
    QStringList params;

    params << "createJSON.py";
    p.start("python.exe", params);
    p.waitForFinished(-1);
    QString p_stdout = p.readAll();

我的 Python 脚本在成功运行时会创建一个 JSON 文件。 所以我可以看看是否运行成功。

【问题讨论】:

你真的到了stdout被读取的地步吗? 我得到一个空字符串。 你试过阅读stderr吗?另外,根据文档,如果进程成功启动,QProcess 将发出started();否则,将发出 errorOccurred()。 您是否尝试将这些信号挂钩到 lambda 处理程序以查看实际发生的情况? 【参考方案1】:

我已经能够为您的代码编写更详细的版本。

    QProcess p;
    QStringList params;

    params << "createJSON.py";
    QObject::connect(&p, &QProcess::started, []() 
        qInfo() << "Process started!";
    );
    QObject::connect(&p, &QProcess::errorOccurred, [&p]() 
        qWarning() << "Error occurred" << p.errorString();
    );

    p.start("python.exe", params);
    p.waitForFinished(-1);
    QString p_stdout = p.readAllStandardOutput();
    QString p_stderr = p.readAllStandardError();

    qDebug() << "OUT" << p_stdout;
    qDebug() << "ERR" << p_stderr;

这实际上会导致错误。就我而言,我得到以下信息:

进程开始了!

输出“”

ERR "python.exe: 无法打开文件 'createJSON.py': [Errno 2] 没有这样的文件或目录\n"

您的情况可能会有所不同。无论哪种方式,使用errorOccurred 信号和errorString 方法将允许您调试进程实际上无法启动的情况。阅读stderr 将允许您调试进程启动但未按预期运行的情况。

【讨论】:

谢谢。现在我得到: 1.“进程已启动!” 2.“发生错误:进程崩溃”3.“OUT”“”3.ERR“致命Python错误:initsfseconding:无法加载文件系统编解码器\nModuleNotFoundError:没有名为'encodings'的模块\n当前线程0x0000005834(最新先打电话):\n 我没有像“enconding”这样的东西…… 两件事。首先,尝试调用完整的 Python 路径(如果您有多个 Python 版本,这可能是原因):p.start("C:/Python36/python.exe") 而不仅仅是 "python.exe"。您也可以找到帮助here(即使原始主题不相关,但很多人都在发布您所面临问题的答案)。 谢谢你的回答,我用配置重新安装了python(“将Python添加到PATH”),我也按照你说的做了:p.start(“C:/…/Python37-32/ python.exe,参数),但我得到同样的错误。 愚蠢的问题,但是您尝试过重新启动计算机吗?

以上是关于在 Qt 中运行 .py 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Qt:在制作之前运行脚本

Qt5 在 Python 脚本中调用函数

Python脚本无法从Qt完全运行

Python 脚本不能完全从 Qt 运行

python脚本怎么执行

从 C++/Qt 程序在 Windows 中运行 Anaconda 脚本