2 回答

TA貢獻1820條經驗 獲得超10個贊
自己手動拆分命令行可以顯著簡化整個問題。
subprocess.run(['pkill', 'Web Content'], check=True)
如果您確實需要 Python 來執行拆分,shlex.split()
請實現您假設 Python 常規split
函數將遵守的規則。事實并非如此;它只是在您提供的字符串上拆分,不支持轉義等。

TA貢獻1825條經驗 獲得超4個贊
您有 2 個選擇:
使用subprocess.call("pkill 'Web Content'", shell=True)
?或
subprocess.call(shlex.split("pkill 'Web Content'"))
選項1
來自文檔:
在 shell=True 的 POSIX 上,shell 默認為 /bin/sh。如果 args 是字符串,則該字符串指定要通過 shell 執行的命令。這意味著字符串的格式必須與在 shell 提示符下鍵入時完全相同。
split()
將 Python 字符串拆分為空格:
>>>?"pkill?'Web?Content'".split() ['pkill',?"'Web",?"Content'"]
因此,為:subprocess.call("pkill 'Web Content'".split())
提供了兩個參數,而它只需要一個參數。這就是錯誤彈出的原因。pkill
"'Web"
"Content'"
pkill: only one pattern can be provided
請注意等同于的subprocess.call
?簽名subprocess.Popen
:
subprocess.Popen(args,..
來自文檔:
args 應該是程序參數的序列,或者是單個字符串或類似路徑的對象。默認情況下,如果 args 是一個序列,則要執行的程序是 args 中的第一項。
使用時還要注意安全注意事項shell=True
選項2
如果您想提供 args 序列,請使用shlex.split
:
>>>?s?=?"pkill?'Web?Content'" >>>?import?shlex >>>?args?=?shlex.split(s) >>>?import?subprocess >>>?subprocess.call(args)
shlex.split
將使用類似 shell 的語法分割字符串。s
使用哪個選項取決于您:
了解 shell=True 與 shell=False 使用 shell=True 將單個字符串傳遞給 shell,shell 從那里獲取它。
使用 shell=False 可以繞過 shell 將參數列表傳遞給操作系統。
當您沒有 shell 時,您可以保存進程并消除相當大量的隱藏復雜性,這可能會或可能不會隱藏錯誤甚至安全問題。
另一方面,當您沒有 shell 時,您就沒有重定向、通配符擴展、作業控制和大量其他 shell 功能。
添加回答
舉報