我正在尝试在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);
parameter1
和parameter3
是从文件对话框中获取的QStrings(两个路径都正确),parameter2
和parameter4
是硬编码字符串(以防万一,这些字符串中包含字符“ - ”和“。”。函数qStringToStdString
是我创建的用于将QString
转换为std::string
的函数,它运行正常(我已经使用过它)。
PyCommand在控制台中打印,看起来很好。事实上,如果我打开一个终端并尝试执行bash -c
,然后执行printf指令,它就可以运行。但是当我执行Qt应用程序时它不起作用。
有人可以帮助我吗?我缺少的东西?
答案 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)
答案 1 :(得分:3)
您需要使用QStringList()
作为命令行参数。
您的pyCommand
必须是QStringList
。
这样的事情:
QStringList pyCommand;
pyCommand << "-f" << parameter1 <<
"-t" << parameter2 <<
"-v" << parameter3 <<
"-e" << parameter4;
process.start(scriptFile, pyCommand);
答案 2 :(得分:1)
所以最后我开始工作了。正如Laszlo所述,它应该执行的方式是使用python
启动一个进程,并将所有参数作为QStringList
传递。这就是我在开始时尝试过的,而根本就没有用。所以我在互联网上查找信息,我看到许多人正在执行bash
进程,然后他们使用python命令传递一个字符串,而不是像我一样。我试着这样做,但它也没有工作......
解决方案?好吧,在这里提出问题之前,我已经完成了我应该做的事情。我用一些编写输出的简单方法连接了过程中最重要的信号(启动,完成和错误)。最后我发现python正在返回2
(没有这样的文件或目录)作为exitCode
。
似乎应用程序没有将可执行路径作为根路径,因此我所指的路径("../../scriptPath/script.py"
)不存在。为了获得正确的二进制路径,我现在使用QDir::currentPath() + "/scriptPath/script.py"
。