2013-04-12 72 views
4

我需要使用QProcess啓動一些腳本。QProcess多平臺命令

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

但是,如果我在Linux等其他操作系統下運行,這將不起作用。

所以,我想知道是否最好的解決方案,使該代碼可移植,將干擾多平臺腳本解決方案,如TCL爲例。

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

但是,我有三個有關這個問題的問題。因爲我不確定我做了什麼。

  • 將​​執行tclsh與文件test.tcl Windows和Linux下,無論我執行了嗎?它似乎這樣做,但我想確定!有沒有可能發生的不良情況?
  • 這是一個很好的解決方案嗎?我知道很多人比我有更多的經驗,我會很感激我能學到的東西!
  • 爲什麼不使用std::system()?它是不是便攜式?

回答

3

雖然這不是一個總的回答,我可以指出一些事情。

特別是,tclsh在Windows下相當開心;它是一個主要的支持平臺。在實踐中可能發生的主要問題是,如果你傳遞一個文件名,其中有一個空格(由於社區實踐的差異,這在Windows下明顯比在Unix上更可能)。但是,您所寫的的​​沒有問題。那麼,只要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

此外,嵌入爲您提供了一些其他優勢:一種成熟的腳本語言,具有良好的文檔,更多的控制(您可以設置變量,讀取它們,向Tcl interp添加自己的命令...)一個自己的過程。 –

+0

感謝那部分代碼,可能會派上用場! – Xaltar

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 
+0

噢,我需要安裝TCLSH。但是如果我使用多個操作系統,我不知道我是否會在代碼中使用多個'#ifdef'腳本,或者在每個編譯環境中安裝TCLSH。這似乎是一個選擇問題。 – Xaltar