2 回答

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

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