我正在编写一个python脚本来运行一个已编译的二进制文件,其源代码是用C ++编写的,可以使用命令行参数改变参数。
e.g。 os.system("./my_program " + my_arg)
让我们说从main()
更改此参数太麻烦了。
相反,我想在一些包含的头文件中设置它
#define MY_PARAM my_val
其中my_val
在程序运行时被视为命令行参数。
我正在使用gcc编译
有什么想法吗?
答案 0 :(得分:2)
根据您的代码段:
os.system("./my_program " + my_arg)
您只是尝试向您的程序发送参数输入。您不需要使用预处理器定义(例如#define SOMETHING
)。 (事实上,你不能,因为二进制文件已经构建完毕。)
而是将main
功能从int main()
修改为int main(int argc, char *argv[])
。
您以类似于以下内容的方式使用它:
#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交互式解释器中使用:
➜ /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
>>>
最后的零是来自Python system
调用的返回代码,说一切都很顺利。
答案 1 :(得分:0)
愚蠢的问题。我想我在问之前没有正确理解我试图解决的问题!我通过以下方式解决了这个问题:
使用-D选项在makefile中添加可选参数以设置这些编译时变量。这将使用运行make
时给出的值替换指定的变量名称。
一个python脚本循环遍历一堆选项,每次调用os.system("make OPT1=" + str(opt1) + "OPT2=" + str(opt2))
等后跟os.system(“./ myprog | tee mylogfile.log”)
然后python脚本解析了日志文件,其中包含的输出随着作为make
的参数输入的选项而变化。
希望这有助于任何想要做类似事情的人。