2009-09-07 16 views
40

Ich arbeite an ein paar Linux-Tools und muss die Installation unter Windows verhindern, da es von FHS abhängt und somit auf dieser Plattform unbrauchbar wird. Die platform.platform Funktion wird geschlossen, gibt aber nur eine Zeichenfolge zurück.Windows Python zuverlässig erkennen

Leider weiß ich nicht, wonach ich in dieser Zeichenfolge suchen soll, um ein zuverlässiges Ergebnis zu erhalten. Weiß jemand, wonach man sucht oder weiß jemand von einer anderen Funktion, die ich hier vermisse? diese

Antwort

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

Versuchen:

import platform 

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

Edit: Gerade gesehen, dass Sie versucht haben, platform.platform() ... platform.system() wird für diesen Fall besser funktionieren. Vertrau mir, benutze es. Dunkle Ecken liegen in der Plattformerkennung.

distutils wird dies auch tun, wenn Sie es schön fragen.

Sie könnten immer etwas Schlechtes wie os.path.exists() auf einer Windows-Datei ... aber platform ist so zuverlässig wie es in der Python-Standard-Bibliothek.

Edit 2: Ein weiterer hilfreicher Antworter platform.system() wies darauf hin, ist genau auf "Windows" auf seinem Windows-Rechner gleich.

+1

ich auch habe Windows nicht praktisch, aber diese ‚Linux‘ Funktion gibt auf meinem PC. Die Dokumente scheinen "Windows" zu erwähnen, also denke ich, dass ich einfach damit gehen werde und hoffe, dass es alle Fälle abdeckt. – blokkie

+0

Es sollte. Siehe Pax's Antwort. –

+0

Ah, deine Änderungen haben es aufgeräumt. Herzlichen Dank. – blokkie

16

In meiner Windows-Box gibt platform.system()'Windows' zurück.

Allerdings bin ich mir nicht sicher, warum Sie sich darum kümmern würden. Wenn Sie die Plattform technologisch begrenzen wollen, würde ich eine Whitelist anstelle einer Blacklist verwenden.

In der Tat, würde ich es nicht tun technologisch überhaupt da vielleicht die nächste Version von Python hat Win32/Win64 statt Windows (für schwarz-Auflistung) und *nix statt Linux (für White-Listing).

Mein Rat ist einfach anzugeben, was die Anforderungen sind und, wenn der Benutzer dies ignorieren möchte, ist das ihr Problem. Wenn sie sich melden, dass sie die Fehlermeldung "Kann FHS nicht finden" erhalten haben und sie zugeben, dass sie unter Windows laufen, weisen Sie sie vorsichtig darauf hin, dass es sich nicht um eine unterstützte Konfiguration handelt.

Vielleicht sind Ihre Kunden schlau genug, FHS unter Windows laufen zu lassen, damit Ihr Code funktioniert. Sie werden wahrscheinlich nicht schätzen, was sie dann als willkürliche Einschränkung Ihrer Software ansehen würden.

Dies ist ein Problem, mit dem Softwareentwickler jeden Tag konfrontiert werden. Selbst große Organisationen können nicht alle einzelne Plattform und Konfiguration dort draußen unterstützen.

+1

+1, gute Antwort und ich stimme zu. Zu erkennen, dass FHS nicht verfügbar ist, ist eine weitaus bessere Methode, als das Betriebssystem zu erkennen und eine Vermutung zu machen, und es ist sicherer (schließlich wird jemand, der an Ihrem Plattform-Limit herumhackt, sowieso scheitern *!). –

+0

+1, ja eine Whitelist ist vorzuziehen, da die Ecken Fälle sind böse. Wenn ich unter Cygwin auf einer Windows-Box laufe, bekomme ich 'platform.system()' mit 'CYGWIN_NT-5.2-WOW64' zurück. Das wäre nicht meine erste Vermutung gewesen! –

2

Von Hilfe (Plattform)

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' 

„Der Name des Betriebssystems abhängig Modul importiert Die folgenden Namen sind derzeit registriert worden. 'Posix', 'nt'," mac ',' os2 ',' ce ',' java ',' riscos '."(C) http://docs.python.org/library/os.html#os.name

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

zumindest auf meinem Feld '' os.name' posix' zurückgibt, wenn unter Cygwin läuft, und 'nt' wenn unter nativen Fenster bauen – sbk

+0

laufen Ja, Cygwin ein Schmerz, aber für ursprüngliche Geschichte ist dieses Verhalten akzeptiert (falls nicht erwünscht). –

46

Für diejenigen, die hierher kamen nach einem Weg suchen Cygwin von Python zu erkennen (im Gegensatz zu nur Windows-Erkennung), sind hier einige Beispiel Rückgabewert von os.name und platform.system auf verschiedene Plattformen

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 

Von diesem Punkt, wie zwischen nativen Windows und Cygwin unterscheiden sollte offensichtlich sein, auch wenn ich nicht davon überzeugt bin, diese zukunftssicher ist.

* Versionsnummern sind für XP und Win7 respecti vely, verlassen Sie sich nicht auf sie

+3

Mein Cygwin zeigt "Windows". –

+0

@JaceBrowning: fair genug, wir sind wahrscheinlich andere Version von Cygwin oder Python ... Dies ist, wo die „nicht-zukunftssicher“ note in :) – sbk

+0

kommt, ist der Unterschied wahrscheinlich, dass meine Python-Installation Teil von Windows ist, nicht durch Cygwin? –