我试图从Qt应用程序运行python文件但是我有两个问题。一个似乎没有启动python工具。其次,当我尝试使用记事本作为示例进行简单测试时,我注意到当我关闭应用程序时记事本关闭。我不确定为什么python工具没有启动,为什么这个过程并不真正独立于Qt应用程序。
else if(QFileInfo(path).isFile() && path.endsWith(".py", Qt::CaseInsensitive))
{
QProcess::startDetached("C:/python27/python.exe", QStringList() << "C:/Users/john/testing.py");
QProcess *proc = new QProcess();
proc->startDetached("notepad.exe");
}
更新#1 :第二次尝试仍然失败.... 我已经研究了一下,甚至尝试了下面的代码,它现在给了我错误:
ImportError:没有名为site
的模块
这让我感到困惑,因为我设置了env路径。在一天结束时,所有我想要做的是运行如下所示的shell命令,但是从Qt。
"C:/python27/python.exe" "C:/Users/john/testing.py"
最新代码:
QString program( "C:\\Python27\\python.exe" );
QStringList args = QStringList() << "C:\\Users\\jmartini\\Desktop\\Trash\\testing.py";
QProcess process;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("PYTHONHOME", "C:\\Python27");
env.insert("PYTHONPATH", "C:\\Python27\\Lib");
process.setProcessEnvironment(env);
process.execute(program, args);
答案 0 :(得分:2)
我将回顾各种评论中列出的详细信息,并为您的问题提供最终解决方案。
路径和反斜杠
QProcess API在Win32平台上使用 CreateProcess ,因此必须根据操作系统约定(使用反斜杠而不是斜杠)提供路径。在您的示例中,“C:/python27/python.exe”必须转换为“C:\ Python27 \ python.exe”。这里的双反斜杠是由于C ++字符串文字转义。
<强>环境强>
正如您在更新中正确指出的那样,您需要设置一些环境变量,以使Python解释器按预期工作。
您还指定要分离调用的python脚本,因此即使应用程序关闭也可以运行。
Qt&lt; 5.10作为完成此任务的适当API,引入了 Qt 5.10 (参见Qt博客中的this帖子)。
使用Qt 5.10,正确的代码是:
QProcess process;
// set the environment variables
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("PYTHONHOME", "C:\\Python27");
env.insert("PYTHONPATH", "C:\\Python27\\Lib");
process.setProcessEnvironment(env);
// set program name and args
process.setProgram("C:\\Python27\\python.exe");
process.setArguments(args);
// start the detached process
process.startDetached();
您更新后的答案中的代码不起作用,因为它使用静态 execute()方法。你看,静态方法是类的一部分,这意味着你可以从该类的对象实例中调用它,但是,因为它是静态的,所以它无法访问对象的成员。换句话说,execute()无法了解您之前设置的QProcessEnvironment。
出于同样的原因,调用接受两个参数的startDetached()重载也不起作用,因为它也是静态的。
Qt博客文章解释了为什么会创建这种新的非静态重载,这非常适合您的场景。
关闭我的应用会杀死python解释器。
如果您在调试中运行Qt应用,则会出现这种情况。那是因为分离的进程(在这种情况下是python解释器)附加到调试器,并且由于调试会话在你的Qt应用程序关闭时关闭,这也会杀死python。
但是,如果您运行已部署的应用程序(双击exe而不是调试程序),它应该按预期工作。