2011-08-11 61 views
1

我有一堆代碼使用platform軟件包中已棄用的popen。由於這已被棄用,我將把它移到subprocess包。從platform.popen移植到subprocess.Popen?

什麼是popen("some_command")的等效聲明? popen是否被棄用?

+0

這很簡單。閱讀[documentation](http://docs.python.org/library/subprocess.html) – JBernardo

+0

該文檔解釋了它如何替代os.popen,而不是platform.popen。一個正則表達式就是「platform.popen(」python some_script.py「)」 – coffee

+1

它是否會使任何*區別? – JBernardo

回答

0
  • 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可以與你同時運行一個進程。