2009-09-07 76 views
40

我正在研究幾個Linux工具,並且需要防止在Windows上安裝,因爲它依賴於FHS,因此在該平臺上無用。 platform.platform函數接近,但只返回一個字符串。在Python中可靠地檢測Windows

不幸的是,我不知道該字符串中搜索的內容是否可以產生可靠的結果。有沒有人知道要搜索什麼或有人知道我在這裏失蹤的另一個功能?

回答

58
>>> import platform 
>>> platform.system() 
'Windows' 
9

試試這個:

import platform 

if platform.system() == "Darwin": 
    # Don't have Windows handy, but I'd expect "Win32" or "Windows" for it 

編輯:剛剛看到你的努力platform.platform() ... platform.system()將更好地爲這種情況。相信我,使用它。黑暗的角落在平臺檢測。

distutils也會這樣做,如果你問得好。

在Windows文件上,你總是可以做一些不如os.path.exists()的...但是platform和Python標準庫一樣可靠。

編輯2:另一個有用的回答指出platform.system()是完全等於他的Windows機器上的「Windows」。

+1

我也沒有Windows方便,但這個函數返回我的電腦上的'Linux'。這些文檔似乎提到了'Windows',所以我想我會繼續這樣做,並希望它涵蓋所有情況。 – blokkie 2009-09-07 01:34:36

+0

它應該。見Pax的答案。 – 2009-09-07 01:35:45

+0

啊,你的編輯清除了它。多謝。 – blokkie 2009-09-07 01:50:18

16

在我的Windows機器上,platform.system()返回'Windows'

但是,我不知道爲什麼你會打擾。如果你想限制它在技術上運行的平臺,我會使用白名單而不是黑名單。

其實,我也不會做技術,因爲在所有的Python可能的下一個版本可能有Win32/Win64而不是Windows(黑色上市)和*nix代替Linux(白上市)。

我的建議是簡單說明需求是什麼,如果用戶選擇忽略它,那就是他們的問題。如果他們說他們收到了一條錯誤消息,指出「無法找到FHS」,並且他們承認他們正在Windows上運行,則輕輕地向他們指出這不是受支持的配置。

也許你的客戶很聰明,讓FHS在Windows下運行,這樣你的代碼就可以工作。他們不太可能欣賞他們認爲對軟件的任意限制。

這是軟件開發人員每天都面臨的問題。即使是龐大的組織也無法支持每個單一平臺和配置。

+1

+1,很好的答案,我同意。檢測到FHS不可用是一種比檢測操作系統和做出假設更好的方法,並且它更安全(畢竟,有人在你的平臺上限制破解將會失敗*!)。 – 2009-09-07 01:56:33

+0

+1,是的白名單是最好的,因爲角落案件是討厭的。在Windows下運行Cygwin,我得到'platform.system()'返回'CYGWIN_NT-5.2-WOW64'。那不會是我的第一個猜測! – 2009-09-07 10:07:43

2

從幫助(平臺)

system() 
    Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'. 

    An empty string is returned if the value cannot be determined. 
5
>>> import os 
>>> os.name 
'nt' 

「進口依賴操作系統模塊的名稱下列名稱當前已註冊的: 'POSIX', 'NT',「 mac','os2','ce','java','riscos'。「(三)http://docs.python.org/library/os.html#os.name

import os 
if os.name == 'nt': 
    #yourcodehere 
+0

至少在我的機器上''os.name'在Cygwin下運行時返回'posix',在本地窗口下運行時'nt'構建 – sbk 2011-10-03 16:04:26

+0

是的,Cygwin是一種痛苦,但對於原始故事這種行爲被接受(如果不需要)。 – 2012-11-22 12:02:24

46

對於那些來到這裏尋找一種方式,從Python的(而不是僅僅檢測Windows)中檢測到Cygwin的,這裏有來自os.nameplatform.system一些示例返回值在不同的平臺

OS/build  | os.name | platform.system() 
-------------+---------+----------------------- 
Win32 native | nt  | Windows 
Win32 cygwin | posix | CYGWIN_NT-5.1* 
Win64 native | nt  | Windows 
Win64 cygwin | posix | CYGWIN_NT-6.1-WOW64* 
Linux  | posix | Linux 

從這一點來說,如何在Windows本地和Cygwin區分應該是顯而易見的,雖然我不相信這是面向未來的。

*版本號是XP和Win7 respecti真的,不要依賴他們

+3

我的Cygwin顯示「Windows」。 – 2012-06-01 22:10:29

+0

@JaceBrowning:足夠公平的,我們可能使用不同版本的Cygwin或Python ...這是「not-futureproof」筆記出現的地方:) – sbk 2012-06-04 13:28:55

+0

區別在於我的Python安裝可能是Windows的一部分,而不是Cygwin的? – 2012-06-04 17:49:19

相關問題