2016-07-28 168 views
0

該命令使用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

回答

1

正如你所指出的,$ *在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 - 儘可能避免潛在的「有趣」命令滑過 –