我无法弄清楚为什么这不起作用:
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安全设置阻止我的应用程序运行脚本,但我没有任何证据可以暗示这个
答案 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"});