2013-08-27 58 views
4

我試圖確定如果操作系統是基於Unix從Python腳本。我能想到的兩種方法可以做到這一點,但它們都有缺點:如何確定Python腳本運行的操作系統是否類Unix?

  • 檢查platform.system()是一個元組,如("Linux", "Darwin")。問題在於我不想提供每一個類Unix系統的列表,特別是有很多* BSD變種。如果函數os.fchmod存在
  • 檢查,因爲這個功能僅在Unix可用。這似乎不是一個乾淨的或「Pythonic」的方式來做到這一點。
+5

[EAFP](http://docs.python.org/ 2/glossary.html) - 只需讓腳本執行所有操作即可。它可能會在Windows上失敗;只要確定它不符合你的要求即可。 –

+1

檢查'os.name =='posix''? – geoffspear

+0

如何檢查它是否不包含「Windows」? – shahkalpesh

回答

5

的Python的方式做到這一點是不關心你是在什麼平臺上。

如果有多個不同的設備來完成取決於平臺的東西,那麼他們的抽象的函數或類的後面,它應該嘗試的設施,如果該設施不適用於當前平臺上移動到另一個。

+0

這似乎是一個明智的做法。您如何建議在代碼中實施「嘗試並繼續」過程? 像這樣: '嘗試: something_for_windows() 除外: something_for_unix()'? 如果是的話,將如何實現它,如果你是針對兩種以上不同類型的操作系統(例如:在Windows,Linux和Mac /達爾文)? – user2722730

+0

@ user2722730嘗試/除了是做到這一點的一種方法。如果有問題的API返回錯誤代碼,如果該設施不存在,那麼您將測試它們。如果你有兩個以上,那麼你會繼續嵌套這些控制結構。或者,一旦你知道哪個設施被支持,你可以換掉默認的「嘗試一堆東西」的實施,以調用檢測到的設施。 – cdhowie

+0

我需要導入特定於平臺的Python模塊來執行平臺特定的任務,因此沒有API錯誤代碼。要按照我提到的3個平臺的建議來做到這一點,我需要嘗試一下 - 除了嘗試 - 除外。這看起來像一個醜陋的方式來做到這一點,特別是因爲3是一個奇數,最後除了它裏面沒有代碼,或者我需要手動重新引發任何異常被捕獲的Python腳本退出並打印錯誤。 – user2722730

5
import sys 
if 'win' in sys.platform(): 
    #windows 
else: 
    #not windows 

,或者你可以嘗試導入平臺相關的庫

try: 
    import windows_only as generic 
except ImportException: 
    try: 
      import unix_only as generic 
    except ImportException: 
      import stdlib.module as generic 

print generic.common_function() 

,然後還有的總是可靠

>>> import os 
>>> os.name 
nt 
+0

請注意,'os.name'可能是OP想要的粒度 - 「」類Unix系統的「posix」,Windows的「nt」'。文檔說'posix','nt','os2','ce','java'和'riscos'正在使用中。 –

相關問題