多平台命令 QProcess

4

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

在Windows下,我使用QProcess::execute("cmd [...]");来执行.

然而,如果我使用其他操作系统,如Linux,这就不起作用了。

因此,我想知道使代码可移植的最佳解决方案是否是干扰跨平台脚本解决方案,例如TCL。

所以我使用:QProcess:execute("tclsh text.tcl");,它有效。

但是,我对这个问题有三个问题。因为我不确定我所做的事情。

  • execute()会在任何地方都使用文件test.tcl同时使用tclsh吗?看起来是,但我想要确保!是否存在任何可能发生的坏情况?
  • 这是一个好的解决方案吗?我知道很多人比我更有经验,我将感激任何我能学到的东西!
  • 为什么不使用std :: system()< / code>?它是否不太可移植?
2个回答

3
虽然这不是一个完整的答案,但我可以指出一些要点。特别地,tclsh 在Windows下运行得非常好;它是一个主要受支持的平台。实际上可能发生的主要问题是如果传递了一个带有空格的文件名(由于社区惯例的差异,这在Windows上比在Unix上更有可能)。然而,execute() 像你写的那样 没有问题。只要保证tclshPATH中就可以了。
将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()std::system()没有任何概念。


1
此外,嵌入式还具有其他优点:成熟的脚本语言和良好的文档、更多的控制权(您可以设置变量、读取它们并添加自己的命令到Tcl interp...),而使用外部进程总是有自己进程的开销。 - Johannes Kuhn

1
你的解决方案的一个弱点是在Windows上你需要安装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

哦耶,我需要安装TCLSH。但是如果我在多个操作系统上工作,我不知道是否需要在代码中使用多个#ifdef脚本,或者在每个编译环境中安装TCLSH。这似乎是一个选择问题。 - Xaltar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接