我收到了一个编码分配,其中我必须创建一个";模拟器";,我可以选择我想要的任何语言。很自然,我选择了蟒蛇。
我的问题与模拟器本身的实现无关,所以为了简单起见,我们假设我的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