2015-11-02 14 views
-1

我正在編寫一個python腳本來運行一個已編譯的二進制文件,其源代碼是用C++編寫的,使用命令行參數控制參數的變化。使用命令行參數設置#define標識

例如os.system("./my_program " + my_arg)

假設從main()改變這個參數太麻煩了。

相反,我想將其設置在使用一些包含的頭文件 #define MY_PARAM my_val 在程序運行時,其中my_val被作爲一個命令行參數。

我正在使用gcc編譯

任何想法?根據您的代碼段

+0

您的應用程序將不得不知道讀取您的配置文件。你的應用程序中是否有這樣的東西? –

+1

「運行C++程序的python腳本」你的意思是編譯後的二進制文件的源代碼是用C++編寫的嗎?或者這個腳本將採用C++源代碼編譯並執行它? –

+0

您是否針對特定的操作系統? – Bathsheba

回答

0

愚蠢的問題。我想我沒有正確理解問題之前我試圖解決的問題!我過去的這個問題是:

  1. 使用-D選項來設置這些編譯時變量在Makefile中添加可選的參數。這將使用運行make時給出的值替換指定的變量名稱。

  2. Python腳本通過一堆選項循環,每次調用os.system("make OPT1=" + str(opt1) + "OPT2=" + str(opt2))等隨後使用os.system(「./ MYPROG |三通mylogfile.log」)

  3. - Python腳本然後解析日誌文件,其中包含的輸出隨作爲make參數輸入的選項而變化。

希望這有助於任何人想要做類似的事情。

2

os.system("./my_program " + my_arg) 

你只是想以一個參數輸入發送到你的程序。您不需要使用預處理器定義(例如#define SOMETHING)。 (事實上​​,你不能,因爲二進制文件已經被編譯。)

相反,你修改main函數從int main()int main(int argc, char *argv[])

你會用它類似於什麼是下面的方式:

➜ /tmp g++ test.cpp -o argtest 
➜ /tmp ./argtest 
Argument 0: ./argtest 
➜ /tmp ./argtest a b c d e 123 
Argument 0: ./argtest 
Argument 1: a 
Argument 2: b 
Argument 3: c 
Argument 4: d 
Argument 5: e 
Argument 6: 123 
➜ /tmp python3 
Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from os import system 
>>> system('./argtest a b c 123') 
Argument 0: ./argtest 
Argument 1: a 
Argument 2: b 
Argument 3: c 
Argument 4: 123 
0 
>>> 

#include <iostream> 

int main(int argc, char *argv[]) { 
    for(int i = 0; i < argc; ++i) 
     std::cout << "Argument " << i << ": " << argv[i] << std::endl; 
    return 0; 
} 

樣品從上面的代碼,它被放置在test.cpp文件,並使用來自Python3交互式解釋運行

最後的零是來自Python的system調用的返回碼,表示一切正常。