我有一堆代碼使用platform
軟件包中已棄用的popen
。由於這已被棄用,我將把它移到subprocess
包。從platform.popen移植到subprocess.Popen?
什麼是popen("some_command")
的等效聲明? popen是否被棄用?
我有一堆代碼使用platform
軟件包中已棄用的popen
。由於這已被棄用,我將把它移到subprocess
包。從platform.popen移植到subprocess.Popen?
什麼是popen("some_command")
的等效聲明? popen是否被棄用?
platform.popen
還沒有被棄用,因爲我可以告訴。但是,這是一個低層次的函數,您不應該爲了靈活性和可移植性的原因而使用它。
許多其他啓動過程的東西已被棄用,有些在Python 3中被刪除。許多嘗試在Python的歷史中做得很好,而且它的便利功能是迄今爲止最好的。在其他人存在後,其他人變得殘酷,大多數保留人員只是在那裏支持遺留代碼。
如果你要你的代碼移植到使用subprocess
模塊,不看完全等效於你一直在做什麼,否則你將錯過在它是更好方式。閱讀並理解subprocess
文檔,並理解它用於解決啓動過程問題的思路,而不是比較早的替代方案。
subprocess.Popen
如何比舊的替代品更好?
這是安全的。而不是something('shell command here')
,我們做Popen(['shell', 'command', 'here'])
。這不會啓動不必要的shell進程,這使得它更少出錯並且危險。
請考慮是否要求用戶輸入其名稱。我可能會在舊東西寫something('foo %s" % name)
。它應該工作 - 如果用戶給你名字「Mike」,那麼它就變成了一個像foo Mike
這樣的命令。但是如果用戶的名字是「Mike Graham」呢?然後我想要foo 'Mike Graham'
。所以現在我總是在撇號中,但現在如果用戶的名字是"Mike O'Reilley"
?更糟的是,如果他的名字是"Mike; rm -rf /"
呢?這裏的解決方案不是試圖自己逃避這些(這很難做到,更不用說做跨平臺了),而是直接傳遞參數而不用打擾shell,但是不會打擾shell。
它很靈活。您可以完全控制輸入和輸出。
它是無阻塞的。Popen
可以與你同時運行一個進程。
這很簡單。閱讀[documentation](http://docs.python.org/library/subprocess.html) – JBernardo
該文檔解釋了它如何替代os.popen,而不是platform.popen。一個正則表達式就是「platform.popen(」python some_script.py「)」 – coffee
它是否會使任何*區別? – JBernardo