我想在我的test.py腳本中運行一個帶有幾個參數的shell命令行。該test.py運行爲:在python中避免shell = True使用命令行參數
python test.py filename file_2 int
的test.py裏面看起來類似於此:
import sys
filename = sys.argv[1]
file_2 = sys.argv[2]
num = sys.argv[3]
subprocess.call("xargs /bin/bash build/install/programme/bin/programme option -n "+num+" --csv-file="+str(filename)+" -c files/"+str(file_2)+ "< /tmp/my_ids_"+str(file_2)+"_"+str(num),shell=True)
的一點是,我使用shell要避免=真,但所有的到目前爲止我發現的選項並不能爲我在命令行中添加的參數提供一個很好的解決方案。
到目前爲止,我已經嘗試通過與Popen
拆分它,例如不同的選擇:
import sys
filename = sys.argv[1]
file_2 = sys.argv[2]
num = sys.argv[3]
subprocess.Popen(["xargs","/bin/bash","build/install/programme/bin/programme","option","-n", str(num),"--csv-file=",str(filename),"-c","files/",str(file_2),"<",str("/tmp/my_ids_"+str(file_2)+"_"+str(num))])
但是我沒有工作的結果。還嘗試了shlex
,但是在文檔中我再次看不到可以在命令中添加參數的選項。
在此先感謝您的幫助!
爲什麼你想避免'shell = True'? –
@PedroLobito因爲它效率低下並且容易引用錯誤。儘可能將字符串參數列表直接傳遞給'execve'(或正在使用'exec'系列的任何成員)。 – chepner
@PedroLobito,...我會超越「引用錯誤」 - 通過字符串連接生成命令並評估這些字符串,因爲代碼會使您的軟件容易受到注入攻擊。想想[Bobby Tables](https://xkcd.com/327/) - 他有一個名叫'Johnny $(rm -rf $ HOME)'$(rm -rf $ HOME)'的兄弟''。 –