【问题标题】:QProcess will not open python scriptQProcess 不会打开 python 脚本
【发布时间】:2024-05-23 23:40:02
【问题描述】:

我不知道为什么这不起作用:

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 安全设置阻止我的应用程序运行脚本,但我没有任何证据表明这一点

【问题讨论】:

    标签: python qt anaconda qprocess pychart


    【解决方案1】:

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

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

    【讨论】:

    • 这也不起作用:void Controller::on_buttonVisualTracking_clicked() { QString run = "C:\\Development\\Anaconda3\\python.exe"; QStringList args; args &lt;&lt; "C:\\visualTracking.py"; QProcess *trackingProcess = new QProcess(); trackingProcess-&gt;start(run, args); }
    • 好吧,试着通过检查错误代码来看看出了什么问题,比如QProcess::errorString()
    • 我得到的代码是 1 然后 2,虽然我不确定我是否正确地检查了这些,但似乎没有一种直接的方法来获取这些代码。
    【解决方案2】:

    我看到了这个问题。

    但可以通过先启动cmd来解决。

    还可以调用::waitForStarted 阻止,直到进程开始。

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

        //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())
        {
    
    
        }
    

    【讨论】:

    • 我先尝试了这个,因为它看起来更容易实现,但这也不起作用void Controller::on_buttonVisualTracking_clicked() { QString commands = "python C:\\visualTracking.py \n"; QProcess *trackingProcess = new QProcess(); trackingProcess-&gt;start("cmd"); trackingProcess-&gt;write(commands.toLatin1().data()); if(!trackingProcess-&gt;waitForStarted()); }
    • 嗯.. 我没有发现任何问题。 “PATH”环境变量中是否有 python 可执行路径。
    • 是的,它指向 anaconda 文件夹,如果我双击任何 .py 文件,它会毫无问题地运行它。同样从命令提示符“python anyscript.py”也将毫无问题地运行。
    【解决方案3】:

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

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

    更新
    我试过QT 5.10.0 MinGW版本,bug依旧。但是,使用手动安装的 MinGW 的 gcc 和 g++ 不会有同样的问题。估计是Qt自带的MinGW版本太旧了吧?

    【讨论】:

    • 说实话,我不确定,我该如何检查?
    • @granitdev 您在使用 Windows Visual Studio 吗?如果是这样,那么它就是 Qt MSVC。如果您使用 Qt creator 作为 IDE,请检查您的构建设置。
    【解决方案4】:

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

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

    【讨论】: