【问题标题】:qprocess get shell like behaviourqprocess 获得类似 shell 的行为
【发布时间】:2015-01-15 14:26:01
【问题描述】:

我在 Windows(不知道这是否重要)应用程序中使用 QT,并希望使用 QProcess 从我的应用程序启动一些进程。 (实际上是通过一个使用QProcess的qtscript包装器)

这似乎可行,但在使用更高级的命令行时遇到问题,例如使用管道连接程序。

如果我使用以下程序行启动一个进程:

QProcess proc;
QString command = "grep \"false negatives\" test.txt | cut -f2";
proc.start(command);

grep 命令抱怨找不到文件“2”。所以很明显命令行没有像我期望的那样被解释。

如果我在命令前加上 cmd /C 前缀,它运行良好,但这显然不再独立于操作系统,并且可能对命令行参数有一些额外的警告。

有没有类似 Qt 的方法来处理它并强制 Qt 使用一些默认的命令行解释器?

【问题讨论】:

  • @Merlin069 它不是重复的。问题是不同的。我的问题中已经提到了链接问题的答案(通过 shell 调用命令)。
  • 请显示对 QProcess start 的完整调用,而不仅仅是命令行参数。
  • @Merlin069 完成了,但这并没有什么特别之处。
  • 只需调用“bash -c command1 | command2”或“cmd /c command1 | command2”或任何正确的格式。

标签: qt shell qprocess


【解决方案1】:

有没有类似 Qt 的方法来处理它并强制 Qt 使用一些默认的命令行解释器?

简单的答案是否定的,没有 Qt 默认的命令行解释器

QString command = "grep \"false negatives\" test.txt | cut -f2";

此命令不起作用,因为 QProcess 采用第一个标记 (grep) 并将其用作命令,然后将每个项目(以空格分隔)传递给该命令。在这种情况下,管道命令不是 grep 的有效参数,也不是 cut,也不是 -f2。

我评论说this question 的答案可能相似,因为它演示了如何成功地将管道命令与 QProcess 一起使用;请注意,参数用引号括起来。

由于您不想调用 cmd 或 *nix 等价物,例如 bash,您可以通过两次调用 QProcess 来处理这个问题;第一个用于 grep 命令,第二个用于剪切,传入第一个 QProcess 调用的输出。

QProcess::setStandardOutputProcess 函数使这更容易,允许您直接在两个 QProcess 对象之间创建管道。

因此你会做这样的事情:-

QProcess proc1;
QProcess proc2;

proc1.setStandardOutputProcess(&process2);

QString cmd1("grep \"false negatives\" test.txt");
QString cmd2("cut -f2");

proc1.start(cmd1);
proc2.start(cmd2);

【讨论】:

  • 实际的命令字符串是用户定义的,由从 JavaScript 调用 QProcess 包装器的脚本。
  • 然后解析命令字符串,寻找任何管道;如果你找到它们,你就知道你必须创建一个新的 QProcess,拆分字符串并设置标准输出,并根据需要链接它们。
  • 这并不容易,因为不同系统上的参数分隔符不同(windows不支持单引号)管道符号可能出现在参数中作为普通文本符号(正则表达式)......很多警告一个人永远不会介意,直到有人偶然发现它们。管道之后的下一件事情是输入和输出文件重定向或错误通道的重定向......普通shell已经实现了很多东西。为什么要重新实现它? (看看tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
  • 如果我是你,我会简单地使用 #ifdef _PLATFORM 并调用相关的命令行解释器,直接传递字符串。如果您使用的是 Windows、OS X 和 linux,那么您只有两个解释器; cmd 和 bash,或者任何你喜欢的 *nix 。
  • 是的,这是显而易见的做法。我希望一些 Qt 的东西涵盖了一些基本的东西。但当然,这些特定于操作系统的功能不一定兼容(但幸运的是,stdout/stderr 重定向(文件和管道)等最基本的东西是)
猜你喜欢
  • 1970-01-01
  • 2017-12-30
  • 2012-02-12
  • 2011-09-24
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多