QProcess多平台命令

时间:2013-04-12 09:03:06

标签: c++ linux qt tcl multiplatform

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

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

但是,如果我使用其他操作系统(例如Linux),这将无效。

所以,我想知道使代码可移植的最佳解决方案是干扰mutliplatform脚本解决方案,例如TCL例如。

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

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

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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