我需要使用QProcess启动一些脚本。
为此,在Windows下,我使用QProcess::execute("cmd [...]");
。
但是,如果我在Linux等其他操作系统下运行,这将不起作用。
所以,我想知道是否使得代码可移植的最佳解决scheme是干扰多平台脚本解决scheme,例如TCL。
所以我使用: QProcess:execute("tclsh text.tcl");
它的工作。
但是,我有三个有关这个问题的问题。 因为我不确定我做了什么。
execute()
执行tclsh
与文件test.tcl
都在Windows和Linux下,无论我执行它? 它似乎这样做,但我想确定! 有什么不好的情况可以发生? 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