创建一个生成文件,该文件将创建一个可执行文件,该可执行文件将运行具有无限数量参数的python脚本



我收到了一个编码分配,其中我必须创建一个";模拟器";,我可以选择我想要的任何语言。很自然,我选择了蟒蛇。

我的问题与模拟器本身的实现无关,所以为了简单起见,我们假设我的python脚本被称为main.py,它所做的只是打印当我在linux shell中调用它时它接收到的所有参数,类似于这样:

import sys
for arg in sys.argv:
print(arg)

问题是,我必须提供一个Makefile,它将构建一个模拟器可执行文件,以便在linux shell中使用以下语法:


make                                //makes or builds the simulator executable
./simulator arg1 arg2 arg3 arg4     //runs main.py, can receive unlimited amount of args, lets say 4
arg1 arg2 arg3 arg4                 //output
./simulator arg1                    //this time only 1 argument is provided, should still work
arg1                                //output

分配的测试是自动化的,因此必须使用此语法。没有变通办法,我不能用它的原名来调用我的脚本,也不能使用";python";关键字。必须如上所示进行。到目前为止,我只是在完全没有争论的情况下才设法解决了这个问题:

#############makefile#############

simulator: main.py
@touch simulator
@chmod 777 simulator 
@echo python main.py >> ./simulator                               

当然,在我有争论的情况下,这个解决方案是行不通的。。特别是因为我无法提前知道有多少争论;模拟器";将被调用。

我尝试使用符号链接,但效果不太好。

我觉得我错过了一些很简单的事情,我很想得到你们的帮助。提前感谢!

您需要了解两件事中的一件:shebang(#!(功能,您可以在这里了解这些功能,并可以编写脚本,这样它就可以直接从命令行运行,不需要运行python main.py。那么你的makefile可以是:

simulator: main.py
cp main.py simulator

否则,您必须学习shell脚本如何处理命令行参数,您可以在这里(以及许多其他地方(了解这些内容。但由于多种原因,这要困难得多,尤其是在makefile配方中编写时,必须转义$

多亏了MadScientist的洞察力,这个解决方案对我有效:

simulator: main.py
@touch simulator
@echo 'python main.py' "$$@" >> ./simulator
@chmod u+x simulator

最新更新