Python 執行 Command Line

下面是調用外部程式及各自的優點和缺點的各種方式的總結:

os.system

使用oos.system(“some_command with args”)傳遞命令和參數到系統的外殼。這是不錯的,因為你其實可以在這種方式運行多個命令,並建立管道和輸入/輸出重定向。例如,

os.system(“some_command < input_file | another_command > output_file”)
不過,雖然這很方便,你必須手動處理的指令的文字,如空格等。另一方面轉義,這也可以讓你運行的是簡單的shell命令,並沒有實際的外部程序的命令。
see documentation

os.popen

stream = os.popen(“some_command with args”) ,將做同樣的事情,使用os.system但它給你一個類文件對象,你可以用它來訪問標準的輸入/輸出這一進程。還有的popen其他3變種,所有處理I / O略有不同。如果您傳遞的一切作為一個字串,那麼你的命令傳遞給外面;如果將它們作為一個列表,那麼你不必擔心逃避任何事情。

see documentation

 

subprocess.Popen

該subprocess 用意是替代os.popen,但有被稍微複雜的缺點。例如,

print subprocess.Popen(“echo Hello World”, shell=True, stdout=subprocess.PIPE).stdout.read()

代替

print os.popen("echo Hello World").read()

而subprocess的選項中有一個統一的類,而不是4個不同的popen功能。
see documentation

 

subprocess.call

這基本上就像POPEN類,並採取所有相同的參數,但它只是等待,直到命令完成,讓您的返回代碼。例如:

return_code = subprocess.call("echo Hello World", shell=True)  

see documentation

 

subprocess.run

如果你使用 Python的3​​.5或更高版本,可以使用新的subprocess.run功能,這是很多像上面的,但更靈活,當命令完成執行返回CompletedProcess 對象。

os

os模塊還擁有fork/exec/spawn 功能,但我不建議直接使用它們。

 

 

 

結論

 

subprocess 因該最好的方法,請注意,對於您通過最後的命令所有的方法由shell作為字符串來執行,你有責任逃避它有嚴重的安全隱患,如果你把這個字符串的任何部分不能完全信任(例如,如果一個用戶輸入一些/字符串的任何部分)。如果只是不確定使用這些方法與常量。為了給你一個提示的影響考慮這個代碼

print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()