在Qt

时间:2018-04-18 14:37:55

标签: python c++ qt

我试图从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);

1 个答案:

答案 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而不是调试程序),它应该按预期工作。