QProcess不执行python脚本

时间:2013-10-04 15:27:06

标签: python c++ qt qtcore qprocess

我正在尝试在Qt(在Linux中)执行一个执行python脚本的进程,但我无法使其工作。这是代码:

QProcess process;
QString scriptFile = "../../scriptPath/script.py";

QString pyCommand = "\"python " + scriptFile + 
                    " -f " + parameter1 +
                    " -t parameter2" +
                    " -v parameter3" +
                    " -e " + parameter4 + "\"";

printf("PyCommand: %s\n", qStringToStdString(pyCommand).c_str());

process.start ("bash", QStringList () << "-c" << pyCommand);

parameter1parameter3是从文件对话框中获取的QStrings(两个路径都正确),parameter2parameter4是硬编码字符串(以防万一,这些字符串中包含字符“ - ”和“。”。函数qStringToStdString是我创建的用于将QString转换为std::string的函数,它运行正常(我已经使用过它)。

PyCommand在控制台中打印,看起来很好。事实上,如果我打开一个终端并尝试执行bash -c,然后执行printf指令,它就可以运行。但是当我执行Qt应用程序时它不起作用。

有人可以帮助我吗?我缺少的东西?

3 个答案:

答案 0 :(得分:9)

您的代码忽略了API的设计方式。您应该使用下面提到的任何替代方案。明确使用python解释器取决于您是否在python脚本中正确使用shebang。我只是让它参考,但你可以很容易地摆脱它。这不是你问题的主要内容。

第一个替代方案(基于QStringList

QProcess process;
QString scriptFile =  QCoreApplication::applicationDirPath() + "../../scriptPath/script.py";

QStringList pythonCommandArguments = QStringList() << scriptFile
    << "-f " << parameter1 << "-t" <<  parameter2 << "-v"
    <<  parameter3 << "-e" << parameter4;

printf("PyCommand: %s\n", qStringToStdString(pythonCommandArguments.join(' ')).c_str());

process.start ("python", pythonCommandArguments);

第二种替代方法(基于QString

QProcess process;
QString scriptFile =  QCoreApplication::applicationDirPath() + "../../scriptPath/script.py";

QString pyyhonCommand = "python " + scriptFile + 
                    " -f " + parameter1 +
                    " -t parameter2" +
                    " -v parameter3" +
                    " -e " + parameter4;

printf("PyCommand: %s\n", qStringToStdString(pythonCommand).c_str());

process.start (pythonCommand);

在这里,您可以找到两种方式的正确方法签名:

  • void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)

http://doc.qt.io/qt-5/qprocess.html#start

  • void QProcess::start(const QString & command, OpenMode mode = ReadWrite)

http://doc.qt.io/qt-5/qprocess.html#start-3

答案 1 :(得分:3)

您需要使用QStringList()作为命令行参数。

您的pyCommand必须是QStringList

这样的事情:

QStringList pyCommand;
pyCommand << "-f" << parameter1 <<
                "-t" << parameter2 <<
                "-v" << parameter3 <<
                "-e" << parameter4;

process.start(scriptFile, pyCommand);

请参阅文档:http://doc.qt.io/qt-5/qprocess.html#start

答案 2 :(得分:1)

所以最后我开始工作了。正如Laszlo所述,它应该执行的方式是使用python启动一个进程,并将所有参数作为QStringList传递。这就是我在开始时尝试过的,而根本就没有用。所以我在互联网上查找信息,我看到许多人正在执行bash进程,然后他们使用python命令传递一个字符串,而不是像我一样。我试着这样做,但它也没有工作......

解决方案?好吧,在这里提出问题之前,我已经完成了我应该做的事情。我用一些编写输出的简单方法连接了过程中最重要的信号(启动,完成和错误)。最后我发现python正在返回2(没有这样的文件或目录)作为exitCode

似乎应用程序没有将可执行路径作为根路径,因此我所指的路径("../../scriptPath/script.py")不存在。为了获得正确的二进制路径,我现在使用QDir::currentPath() + "/scriptPath/script.py"