2

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

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

4 回答 4

0

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

有关如何执行此操作的示例,请参见此答案。您可能需要指定完整路径python.exe才能让它为您工作,例如"C:\\Python26\\python.exe".

于 2017-05-08T16:48:15.287 回答
0

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

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

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

于 2018-01-25T04:53:54.920 回答
0

我看到了这个问题。

但可以先开始解决cmd

还要调用 ::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())
    {


    }
于 2017-05-08T16:53:23.967 回答
0

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

auto *process = new QProcess{this};
connect(process, &QProcess::errorOccurred, []{
  qFatal("process error occurred");
});
process->start("python", {"-i", "myscript.py"});
于 2018-05-03T18:33:08.567 回答