QProcess无法执行Python脚本

6

我正在尝试在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是我从文件对话框中获取的QString(路径都正确),parameter2parameter4是硬编码的字符串(仅作为备选,这些字符串中包含'-'和'.'字符)。qStringToStdString函数是我创建的一个函数,用于将QString转换为std::string,它已经可以正常使用了(我已经使用过它)。
在控制台上打印PyCommand并且看起来很好。实际上,如果我打开终端并尝试执行printf指令得到的结果,并跟随bash -c,它也可以工作。但当我执行Qt应用程序时,它就不能工作。
有人能帮我解决吗?我有所遗漏吗?
3个回答

11
你的代码忽略了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 pythonCommand = "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


4

您需要使用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。此链接提供有关如何启动进程的详细信息。

1
最终,我让它工作了。正如Laszlo所评论的那样,应该使用python启动进程,并将所有参数作为QStringList传递。这是我一开始尝试过但完全不起作用的方法。因此,我在互联网上寻找信息,发现许多人都在执行bash进程,然后他们传递了一个包含python命令的字符串,而不是像我那样做。我试图那样做,但还是不起作用...解决方案?好吧,我在在这里提问之前应该做的事情。我连接了进程的最重要的信号(启动、完成和错误)与一些简单的方法,写出输出。最后,我发现python返回2(没有这个文件或目录)作为exitCode。似乎应用程序没有将可执行路径作为根路径,因此我引用的路径("../../scriptPath/script.py")不存在。为了获取正确的二进制路径,我现在使用QDir::currentPath() + "/scriptPath/script.py"

嗯,不要使用我在帖子中提到的QDir::currentPath(),而是使用QCoreApplication::applicationDirPath()。我建议您再次查看我的答案。这可能不是最好的答案可供接受,但我会留给您。 - László Papp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接