使用$ *为蟒蛇

使用$ *为蟒蛇

问题描述:

该命令使用os.system参数的一部分:

make foo -f $* 

已从命令行与当它从一个Python脚本调用调用的时候如下不同的功能:

import os 
os.system(make foo -f $*) 

如上所述:http://tldp.org/LDP/abs/html/internalvariables.html#APPREF $ *在一个bat文件中基本上是所有位置参数看作一个单词。

Python似乎只是将其解析为“$ *”。无论如何要解决这个问题并复制相同的功能?

我知道我可以写一个.bat脚本,并用python调用它,但我希望能有更多的口才。

+0

忘掉'os.system'。尽可能地使用'subprocess'中的函数和* *尽可能避免*传递'shell = True'。 – Bakuriu

正如你所指出的,$ *在python中没有特殊的含义。理解完全取决于你使用的任何shell。如果你想通过传递给你的脚本命令的一些所有的位置参数,那么你可以尝试以下

import os, sys 
os.system("make foo -f {}".format(" ".join(sys.argv[1:]))) 

不过请注意的是os.system已被弃用。您应该使用

import subprocess, sys 
subprocess.check_call("make foo -f {}".format(" ".join(sys.argv[1:])), shell=True) 

改为。

编辑

作为评价建议,每当命令是从“不可信的”输入,内置的程序的命令行,例如一个应避免使用shell=True。因此更好的选择是使用

import subprocess, sys 
subprocess.check_call(['make', 'foo', '-f'] + sys.argv[1:]) 
+2

请注意,没有理由使用'shell = True'来做到这一点。使用'check_call(['make','foo','-f'] + sys.argv [1:])'你甚至可以摆脱调用'join'的方法。 – Bakuriu

+0

@Bakuriu好点:) –

+0

@Bakuriu打败了我 - 这里没有理由在这里使用shell - 尽可能避免潜在的“有趣”命令滑过 –