QProcess不会打开python脚本

时间:2017-05-08 16:14:57

标签: python qt anaconda qprocess pychart

我无法弄清楚为什么这不起作用:

void Controller::on_buttonVisualTracking_clicked()
{
    QProcess *trackingProcess = new QProcess();
    trackingProcess->start("python C:\\visualTracking.py");
}

这里的特定脚本是pychart脚本,如果我只是从命令行运行它,它会正确执行,打开一个显示图表的窗口。这是我应该强调的,我期待一个新窗口打开显示pychart,这是我自己运行脚本时得到的。

我也尝试过这段代码,看看QProcess是不是没有用。然而,这按预期工作,并出现一个空的记事本窗口。

void Controller::on_buttonVisualTracking_clicked()
{
    QProcess *trackingProcess = new QProcess();
    trackingProcess->start("notepad");
}

那么我想也许我提供参数的方式有问题,所以我尝试了这个,它打开了一个带有visualTracking.py文本的记事本窗口,如你所料。

void Controller::on_buttonVisualTracking_clicked()
{
    QProcess *trackingProcess = new QProcess();
    trackingProcess->start("notepad C:\\visualTracking.py");
}

因此,我完全不知所措。为什么QProcess不会打开python脚本?

更新: 根据我的建议,我现在尝试了这两个选项,但都没有。

void Controller::on_buttonVisualTracking_clicked()
{
    QString run = "C:\\Development\\Anaconda3\\python.exe";
    QStringList args;
    args << "C:\\visualTracking.py";

    QProcess *trackingProcess = new QProcess();
    trackingProcess->start(run, args);
}

void Controller::on_buttonVisualTracking_clicked()
{
    QString commands = "python C:\\visualTracking.py";

    QProcess *trackingProcess = new QProcess();
    trackingProcess->start("cmd");
    trackingProcess->write(commands.toLatin1().data());
    if(!trackingProcess->waitForStarted()){};
}

更新: 我以为我有一个解决方案,但不幸的是我再次在开发机器上再次无法运行python脚本。我不知道为什么行为会随机变化。我唯一的猜测是一些Windows安全设置阻止我的应用程序运行脚本,但我没有任何证据可以暗示这个

4 个答案:

答案 0 :(得分:0)

使用QProcess,您只能启动真正的可执行文件,而不是脚本。因此,您需要运行python解释器python.exe并将您的脚本作为参数。

有关如何执行此操作的示例,请参阅this answer。您可能需要指定python.exe的完整路径以使其适用于您,例如"C:\\Python26\\python.exe"

答案 1 :(得分:0)

我看到了这个问题。

但是能够先通过::waitForStarted开始解决。

也请阻止 //YOUR PY COMMAND QString pyCommand("python C:\\visualTracking.py \n"); //try with out " \n" also... //CREATE A PROCESS OBJECT QProcess *qprocess = new QProcess(this); //START THE CMD qprocess->start("cmd"); //WRITE YOUR PY COMMAND TO PROCESS qprocess->write(pyCommand.toLatin1().data()); //BLOCK THE PROCESS UNTILL IT STARTED if (!qprocess->waitForStarted()) { } 阻止,直到该过程开始。

检查它是否适合您(评论中的详细信息)。

{{1}}

答案 2 :(得分:0)

您使用的是Qt5.8.0 MinGW版本吗?我遇到了同样的问题,切换到Qt5.8.0 MSVC版本后一切正常。

我还没有尝试过其他版本,但我认为这可能是问题所在。希望这个帮助

<强>更新
我尝试了QT 5.10.0 MinGW版本,该bug仍然存在。但是,使用手动安装的MinGW的gcc和g ++不会有同样的问题。我想这是因为Qt附带的MinGW版本可能太旧了?

答案 3 :(得分:0)

我的交互式脚本遇到了类似的问题;解决方案是强制它以交互方式运行:

auto *process = new QProcess{this};
connect(process, &QProcess::errorOccurred, []{
  qFatal("process error occurred");
});
process->start("python", {"-i", "myscript.py"});