Pour autant que je sache, Python a 3 façons de savoir sur quel système d'exploitation fonctionne:
os.name
sys.platform
platform.system()
Connaître ces informations est souvent utile dans les importations conditionnelles, ou en utilisant des fonctionnalités qui diffèrent entre les plates-formes (par exemple time.clock()
sous Windows et time.time()
sous UNIX).
Ma question est, pourquoi 3 façons différentes de faire cela? Quand faut-il utiliser un moyen et pas un autre? Quelle est la «meilleure» méthode (la plus à l'épreuve du temps ou la moins susceptible d'exclure accidentellement un système particulier sur lequel votre programme peut réellement fonctionner)?
Il semble que ce sys.platform
soit plus spécifique que os.name
, vous permettant de distinguer win32
de cygwin
(par opposition à juste nt
) et linux2
de darwin
(par opposition à juste posix
). Mais si tel est le cas, qu'en est-il de la différence entre sys.platform
et platform.system()
?
Par exemple, ce qui est mieux, ceci:
import sys
if sys.platform == 'linux2':
# Do Linux-specific stuff
ou ca? :
import platform
if platform.system() == 'Linux':
# Do Linux-specific stuff
Pour l'instant, je sys.platform
m'en tiendrai, donc cette question n'est pas particulièrement urgente, mais je serais très reconnaissant d'avoir des éclaircissements à ce sujet.
la source
sys.platform.startswith('linux')
au lieu desys.platform == 'linux2'
pour une compatibilité futureRéponses:
Plongé un peu dans le code source.
La sortie de
sys.platform
etos.name
est déterminée au moment de la compilation.platform.system()
détermine le type de système au moment de l'exécution.sys.platform
est spécifié comme un compilateur défini lors de la configuration de construction.os.name
vérifie si certains modules spécifiques os sont disponibles (par exempleposix
,nt
...)platform.system()
exécute réellementuname
et potentiellement plusieurs autres fonctions pour déterminer le type de système au moment de l'exécution.Ma suggestion:
os.name
pour vérifier s'il s'agit d'un système compatible posix.sys.platform
pour vérifier s'il s'agit d'un linux, cygwin, darwin, atheos, etc.platform.system()
si vous ne croyez pas aux autres sources.la source
Il y a une fine différence entre
platform.system()
etsys.platform
et il est intéressant pour la plupart des cas deplatform.system()
dégénérer ensys.platform
Voici ce que
Python2.7\Lib\Platform.py\system
dit la sourceÉgalement par la documentation
la source
À partir de la
sys.platform
documentation :os.name
a une granularité plus grossièreos.uname()
donne des informations de version dépendant du systèmeplatform
module fournit des contrôles détaillés de l'identité du systèmeSouvent, le «meilleur» moyen à l'épreuve du temps de tester si certaines fonctionnalités sont disponibles est simplement d'essayer de les utiliser et d'utiliser une solution de secours en cas d'échec.
platform.system()
retourne une valeur normalisée qu'il pourrait obtenir à partir de plusieurs sources:os.uname()
,sys.platform
,ver
commande (sous Windows).la source
Cela dépend si vous préférez déclencher une exception ou essayer quoi que ce soit sur un système non testé et si votre code est si haut ou si bas niveau qu'il peut ou ne peut pas fonctionner sur un système similaire non testé (par exemple Mac non testé - 'posix' ou sur systèmes ARM embarqués). Plus pythonique est de ne pas énumérer tous les systèmes connus mais de tester d'éventuelles propriétés pertinentes. (par exemple, il est considéré comme important la finalité du système mais les propriétés de multitraitement sans importance.)
os.name est une résolution suffisante pour une utilisation correcte du
os
module. Les valeurs possibles sont 'posix', 'nt', 'os2', 'ce', 'java' ou 'riscos' en Python 2.7, tandis que seuls les 'posix', 'nt' et 'java' sont utilisés depuis Python 3.4.sys.platform est une résolution plus fine. Il est recommandé d'utiliser
if sys.platform.startswith('linux')
idiom car «linux2» signifie un noyau Linux version 2.xx ou 3. Les noyaux plus anciens ne sont actuellement jamais utilisés. Dans Python 3.3, tous les systèmes Linux sont de simples «linux».Je ne connais pas les spécificités des systèmes "Mac" et "Java" et je ne peux donc pas utiliser les résultats de la très bonne méthode platform.system () pour le branchement, mais j'utiliserais les avantages du
platform
module pour les messages et la journalisation des erreurs.la source
os.name
les valeurs possibles de retour sont'posix'
,'nt'
,'java'
selon python 3 documents . Voir aussi: documentation du module de plateforme . Je ne crois pas'riscos'
et'os2
«sont des valeurs de retour possibles deos.name
; il peut s'agir de valeurs de retour desys.platform
. La documentation Python 3sys.platform
ne semble pas exhaustive.os.name
était cohérent entre les versions. Je n'ai pas non plus revérifié la documentation 2.7 , mais je sais maintenant que vous avez raison.Je crois que le module de plate-forme est probablement préféré pour le nouveau code. Les autres existaient avant lui. C'est une évolution, et les autres restent pour compatibilité ascendante.
la source