4

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

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

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

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

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

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

  • 无论我在哪里execute()执行它都会在 Windows 和 Linux 下tclsh使用该文件执行吗?test.tcl似乎是这样,但我想确定!有什么不好的情况会发生吗?
  • 这是一个好的解决方案吗?我知道很多人的经验比我多得多,如果我能学到任何东西,我将不胜感激!
  • 为什么不使用std::system()?便携性差吗?
4

2 回答 2

3

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

尤其tclsh是在Windows下相当开心;这是一个主要的支持平台。在实践中可能发生的主要问题是,如果您传递一个包含空格的文件名(由于社区实践的差异,这在 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()

于 2013-04-12T10:25:09.557 回答
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
于 2013-04-12T10:24:18.297 回答