2015-10-21 70 views
1

我正在嘗試在Python中編寫跨平臺代碼。代碼應該產生新的shell並運行代碼。爲什麼Python的子進程在unix和windows之間變得如此不同?

這導致我看一下Python的工具subprocess,尤其是其Popen一部分。所以我閱讀了這個類Popen doc的文檔,並發現太多「如果在Unix上/如果在Windows上」語句。除非我誤解了文檔,否則不是非常跨平臺的。

這是怎麼回事?我明白這兩個操作系統是不同的,但真的,沒有辦法編寫一個通用接口?我的意思是,「windows與unix不同」的相同論點可以應用於os,system等,並且它們看起來都是100%跨平臺的。

回答

2

問題在於,流程管理是深深植根於操作系統的東西,不僅在實現方面有很大不同,甚至在基本功能方面也大不相同。 實際上,在例如os類中抽象代碼通常相當容易。這兩個C庫,無論是* nix還是Windows,都可以將文件作爲I/O流來讀取,因此您甚至可以編寫相當低級別的文件操作函數,這些函數在Windows和* nix中的工作方式相同。

但過程差別很大。例如,在* nix中,進程都是分層的,每個進程都有一個父進程,所有進程都回到在PID 1下運行的初始化系統。一個新進程是通過分叉創建的,檢查它是父進程還是繼續進程。 在Windows中,進程是嚴格非分層的,並且由CreateProcess()系統調用創建,爲此您需要特殊權限。 有很多更多的差異,這只是兩個例子,但我希望它表明實現一個獨立於平臺的過程庫是一項非常艱鉅的任務。

+0

謝謝,不知道這個! – denvar

+0

+1。爲了補充一點,可能是Windows和Linux之間最重要的區別(就實現用於進程管理的庫API而言)是參數傳遞給孩子的方式。 Windows傳遞代表整個命令行的單個字符串,而Linux傳遞代表單個參數的字符串數組。這聽起來可能不是什麼大問題,但如果任何參數包含特殊字符都可以。程序員經常被這個問題困擾。 –

+0

調用'CreateProcess'不需要特殊的權限,除非你正在談論運行需要提升的進程(根據完整性級別和訪問令牌中已啓用的組)。 'appinfo'服務提供對高架訪問令牌的訪問。通常,您可以使用帶有「runas」動詞的ShellExecute [Ex]來訪問此服務。 Python的標準庫通過'os.startfile'對此只有極小的支持。如果程序表現爲需要提升,則可以使用'shell = True'的'Popen'。否則需要ctypes或PyWin32。 – eryksun

相關問題