5

我正在尝试在 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);

我从文件对话框中获得的 QStrings在哪里parameter1和是(两个路径都是正确的)并且是硬编码的字符串(以防万一,这些字符串中包含字符“-”和“.”)。Function是我创建的用于将 a 转换为 a 的函数,它工作得很好(我已经使用过它)。parameter3parameter2parameter4qStringToStdStringQStringstd::string

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

有人可以帮我吗?我错过了什么?

4

3 回答 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

于 2013-10-04T19:15:36.990 回答
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

于 2013-10-04T15:30:20.993 回答
1

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

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

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

于 2013-10-07T13:25:18.310 回答