QProcess whitspaces和参数的问题



我想通过QProcess调用一个可执行文件。可执行文件的路径可以包含空白。因此,我在可执行文件的路径周围加上引号。

然而,只有在我不添加任何论据的情况下,这才有效。

以下代码再现了问题:

#include <QCoreApplication>
#include <QProcess>
#include <QDebug>
#include <QDir>
int main(int argc, char *argv[])
{
int i = 0; // no whitespace, no argument -> works
//    int i = 1; // whitespace with quotation, no arguments -> works
//    int i = 2; // no whitespace, arguments -> works
//    int i = 3; // whitespace with quotation, arguments -> works not
QCoreApplication a(argc, argv);
QProcess *process = new QProcess();
QString pathToFile;
QString absolutePathToProgram;
pathToFile = "/home/user/tmp/file.xml";
if (i == 0){
absolutePathToProgram = "/home/user/tmp/executable";
}else if(i == 1){
absolutePathToProgram = "/home/user/tmp whitespace/executable";
absolutePathToProgram = """ + absolutePathToProgram + """;
}else if(i == 2){
absolutePathToProgram = "/home/user/tmp/executable";
}else if(i == 3){
absolutePathToProgram = "/home/user/tmp whitespace/executable";
absolutePathToProgram = """ + absolutePathToProgram + """;
}
QStringList arguments;
arguments << pathToFile;
if (i==0 || i==1){
process->start(absolutePathToProgram);
}else{
process->start(absolutePathToProgram,arguments);
}
process->waitForFinished();
QString output(process->readAllStandardOutput());
qDebug() << output;
return a.exec();
}

我添加了4个案例:

  • i == 0:可执行文件的路径不包含空格,并且我们不传递参数。这是有效的
  • i == 1:可执行文件的路径确实包含空格,并且我们不传递参数。这是有效的
  • i == 2:可执行文件的路径不包含空格,并且我们传递参数。这是有效的
  • i == 3:可执行文件的路径确实包含空格,并且我们确实传递参数。这不起作用

为什么案例i == 3不起作用

我使用Ubuntu作为操作系统。

奖金:

我还需要让它在Windows上运行。通常,在Windows上,我用启动程序

process->start("cmd.exe", QStringList() << "/c" << absolutePathToProgram << pathToFile);

我没有时间在windows上测试它,但如果有人发布了答案,并且知道如何在windows上创建解决方案,请告诉我。

可能是静态方法:

QDir::homePath()
QDir::toNativeSeparator(...) 

可以帮助你(对于交叉便携性(

例如

const QString absolutePathToProgram = QDir::toNativeSeparators(QString("%1/QtExamples/tmp dir/my app").arg(QDir::homePath()));

我也遇到过同样的问题。

我使用这个(在python中(

也许您可以将regex用于shlex部分

设置包含双引号中空格的路径

进口shlex

def run(self):
cli = shlex.split(self.commandfield.text(), posix=False)
cmd = str(cli[0]) ### is the executable
if (QStandardPaths.findExecutable(cmd)):
print("command", cmd,  "found")
del cli[0] ### delete first value in list
t = " ".join(cli)
if self.process.state() != 2:
self.process.waitForStarted()
self.process.waitForFinished()
self.process.start((cmd + " " + t))
print("running", self.process.program(), self.process.arguments())
else:
print("error ...")

相关内容

  • 没有找到相关文章

最新更新