我正在嘗試使用subprocess模塊中的run方法從我的 Python 腳本中使用命令行選項啟動命令行程序。我的命令被定義為指定程序和選項的字符串列表,如下所示(其中pheno_fp和construction_fp是代表我系統中文件路徑的字符串,exe是代表我正在運行的程序的文件路徑的字符串): step1_cmd = [exe, "--step 1", "--p " + pheno_fp, "--b 1000", "--o " + construction_fp + "dpw_leaveout"]不工作- 當我嘗試以下操作時,我要運行的程序已啟動,但我指定的命令被錯誤解釋,因為程序退出并顯示錯誤“使用 --o 標志指定輸出文件路徑”: test1 = subprocess.run(step1_cmd)工作- 當我嘗試以下操作時,程序正確執行,這意味著所有參數都按預期解釋: test1 = subprocess.run(" ".join(step1_cmd), shell=True)如果我正確理解了文檔,前一種方法是推薦的用法,但我不明白為什么它不起作用。我很確定它的格式與文檔中的示例相同,所以我有點難過。有任何想法嗎?
2 回答

智慧大石
TA貢獻1946條經驗 獲得超3個贊
將每個參數與其值分開,如下所示:
step1_cmd = [exe,
"--step",
"1",
"--p",
str(pheno_fp), # if it isn't a string already
"--b",
"1000",
"--o",
str(construction_fp) + "dpw_leaveout"
]
因為在傳遞參數列表時,每個部分都用空格分隔,包括選項和它們的值

三國紛爭
TA貢獻1804條經驗 獲得超7個贊
此行為的解釋在這里:
args 是所有調用所必需的,并且應該是一個字符串或一系列程序參數。通常首選提供一系列參數,因為它允許模塊處理任何需要的參數轉義和引用(例如,允許文件名中有空格)。
示例:序列
l?=?['ls',?'-l?tmp']
給出錯誤
subprocess.run(l)?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ls:?illegal?option?--
這是因為subprocess
(這是對 的調用Popen
)正在嘗試運行ls "-l tmp"
。
定義參數序列的正確方法是將它們分開,以便正確引用它們
subprocess.run(['ls',?'-l',?'tmp'])
添加回答
舉報
0/150
提交
取消