如何逃避os.system()調(diào)用?使用os.system()時(shí),通常需要將作為參數(shù)傳遞的文件名和其他參數(shù)轉(zhuǎn)義為命令。我怎樣才能做到這一點(diǎn)??jī)?yōu)選地,可以在多個(gè)操作系統(tǒng)/殼上工作但特別是用于bash的東西。我目前正在做以下操作,但我確定必須有一個(gè)庫(kù)函數(shù),或者至少是一個(gè)更優(yōu)雅/更健壯/更有效的選項(xiàng):def sh_escape(s):
return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")os.system("cat %s | grep something | sort > %s"
% (sh_escape(in_filename),
sh_escape(out_filename)))編輯:我接受了使用引號(hào)的簡(jiǎn)單答案,不知道為什么我沒(méi)有想到這一點(diǎn); 我猜是因?yàn)槲襾?lái)自Windows,其中'和'的表現(xiàn)略有不同。關(guān)于安全性,我理解這個(gè)問(wèn)題,但是,在這種情況下,我對(duì)os.system()提供的快速簡(jiǎn)單的解決方案感興趣,并且字符串的來(lái)源要么不是用戶生成的,要么至少是由用戶輸入的??尚庞脩簦ㄎ遥?。
3 回答

一只斗牛犬
TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊
也許你有特定的使用理由os.system()
。但如果沒(méi)有,你可能應(yīng)該使用該subprocess
模塊。您可以直接指定管道并避免使用shell。
以下內(nèi)容來(lái)自PEP324:
Replacing shell pipe line
-------------------------
output=`dmesg | grep hda`
==>
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
添加回答
舉報(bào)
0/150
提交
取消