QProcess多平台命令

我需要使用QProcess启动一些脚本。

为此,在Windows下,我使用QProcess::execute("cmd [...]");

但是,如果我在Linux等其他操作系统下运行,这将不起作用。

所以,我想知道是否使得代码可移植的最佳解决scheme是干扰多平台脚本解决scheme,例如TCL

所以我使用: QProcess:execute("tclsh text.tcl"); 它的工作。

但是,我有三个有关这个问题的问题。 因为我不确定我做了什么。

  • execute()执行tclsh与文件test.tcl都在Windows和Linux下,无论我执行它? 它似乎这样做,但我想确定! 有什么不好的情况可以发生?
  • 这是一个很好的解决scheme? 我知道很多人比我有更多的经验,我会很感激我能学的东西!
  • 为什么不使用std::system() ? 它是不是便携式?

虽然这不是一个完整的答案,但我可以指出一些事情。

特别是在Windows下tclsh相当开心, 这是一个主要的支持平台。 在实践中可能发生的主要问题是,如果你传递一个文件名,其中有一个空格(由于社区实践的差异,这在Windows下明显比在Unix上更可能)。 但是, 你写execute()没有问题。 那么,只要tclsh位于PATH

将Tcl脚本执行与Qt集成的另一个主要选择是将您的程序与Tcl二进制库链接起来并使用它。 Tcl的API是针对C语言的,所以从C ++使用它应该非常简单(如果从C ++的角度来看有点笨拙):

 // This holds the description of the API #include "tcl.h" // Initialize the Tcl library; *call only once* Tcl_FindExecutable(NULL); // Make an evaluation context Tcl_Interp *interp = Tcl_CreateInterp(); // Execute a script loaded from a file (or whatever) int resultCode = Tcl_Eval(interp, "source test.tcl"); // Check if an error happened and print the error if it did if (resultCode == TCL_ERROR) { std::cerr << "ERROR: " << Tcl_GetString(Tcl_GetObjResult(interp)) << std::endl; } // Squelch the evaluation context Tcl_DeleteInterp(interp); 

我不是一个特别好的C ++编码器,但是这应该给出这个想法。 我不知道QProcess::execute() vs std::system()

你的解决方案的一个弱点是,你必须安装tclsh 。 Solaris上也没有tclsh 。 可能在其他地方。

std::system()相比, QProcess为您提供了更多关于执行命令的过程的控制和信息。 如果你只需要执行脚本(例如不接收输出), std::system()就是一个不错的选择。

我曾经用过类似的情况:

 #ifdef Q_OS_WIN mCommand = QString("cmd /C %1 %2").arg(command).arg(args); #else mCommand = QString("bash %1 %2").arg(command).arg(args); #endif