【问题标题】:QProcess Multiplatform commandQProcess 多平台命令
【发布时间】:2013-04-12 09:03:06
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: c++ linux qt tcl multiplatform


    【解决方案1】:

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

    尤其是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()std::system()

    【讨论】:

    • 此外,嵌入还为您提供了一些其他优势:具有良好文档的成熟脚本语言,更多控制(您可以设置变量,读回它们,将自己的命令添加到 Tcl 解释器......)同时使用外部进程总是有自己进程的开销。
    【解决方案2】:

    您的解决方案的一个弱点是,您必须在 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。这似乎是一个选择问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多