web-dev-qa-db-fra.com

Détecter de manière fiable Windows dans Python

Je travaille sur quelques outils Linux et je dois empêcher l'installation sur Windows, car cela dépend de FHS et est donc rendu inutile sur cette plate-forme. Le platform.platform la fonction se rapproche mais ne renvoie qu'une chaîne.

Malheureusement, je ne sais pas quoi rechercher dans cette chaîne pour qu'elle donne un résultat fiable. Est-ce que quelqu'un sait quoi rechercher ou quelqu'un connaît-il une autre fonction qui me manque ici?

52
blokkie
>>> import platform
>>> platform.system()
'Windows'
73
Matthew Iselin

Pour ceux qui sont venus ici à la recherche d'un moyen de détecter Cygwin à partir de Python (par opposition à la simple détection de Windows), voici quelques exemples de valeurs de retour de os.name et platform.system sur différentes plateformes

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

À partir de là, la distinction entre Windows natif et Cygwin devrait être évidente, bien que je ne sois pas convaincu que ce soit à l'épreuve du temps.

* les numéros de version sont pour XP et Win7 respectivement, ne vous fiez pas à eux

55
sbk

Sur ma boîte Windows, platform.system() renvoie 'Windows'.

Cependant, je ne sais pas pourquoi vous vous embêtez. Si vous voulez limiter technologiquement la plate-forme sur laquelle il fonctionne, j'utiliserais une liste blanche plutôt qu'une liste noire.

En fait, je ne le ferais pas du tout technologiquement puisque peut-être la prochaine version de Python peut avoir Win32/Win64 au lieu de Windows (pour la liste noire) et *nix au lieu de Linux (pour la liste blanche).

Mon conseil est d'indiquer simplement quelles sont les exigences et, si l'utilisateur choisit de l'ignorer, c'est son problème. S'ils sonnent en disant qu'ils ont reçu un message d'erreur indiquant "Impossible de trouver FHS" et qu'ils admettent qu'ils fonctionnent sous Windows, indiquez-leur doucement que ce n'est pas une configuration prise en charge.

Peut-être que vos clients sont assez intelligents pour faire fonctionner FHS sous Windows afin que votre code fonctionne. Il est peu probable qu'ils apprécient ce qu'ils considéreraient alors comme une limitation arbitraire de votre logiciel.

C'est un problème rencontré quotidiennement par les développeurs de logiciels. Même les grandes organisations ne peuvent pas prendre en charge chaque plate-forme unique et configuration.

17
paxdiablo

Essaye ça:

import platform

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

Edit: Je viens de voir que vous avez essayé platform.platform()...platform.system() fonctionnera mieux dans ce cas. Croyez-moi, utilisez-le. Les coins sombres se trouvent dans la détection de la plate-forme.

distutils le fera aussi, si vous le demandez gentiment.

Vous pouvez toujours faire quelque chose de mal comme os.path.exists() sur un fichier Windows ... mais platform est aussi fiable que dans la bibliothèque standard Python.

Edit 2: Un autre répondeur utile a souligné que platform.system() est exactement égal à "Windows" sur sa machine Windows.

10
Jed Smith
>>> import os
>>> os.name
'nt'

"Le nom du module dépendant du système d'exploitation importé. Les noms suivants sont actuellement enregistrés: 'posix', 'nt', 'mac', 'os2', 'ce', 'Java', 'riscos'." (c) http://docs.python.org/library/os.html#os.name

import os
if os.name == 'nt':
    #yourcodehere
8
anatoly techtonik

De l'aide (plateforme)

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

    An empty string is returned if the value cannot be determined.
2
boatcoder