28 votes

Est-il sûr d'utiliser la vérification sys.platform=='win32' sur Python 64 bits ?

La vérification habituelle pour différencier l'exécution d'une application Python sur Windows et sur d'autres systèmes d'exploitation (Linux en général) consiste à utiliser le conditionnel :

if sys.platform == 'win32':
    ...

Mais je me demande si l'on peut l'utiliser en toute sécurité aujourd'hui, alors que Python 64 bits est plus largement utilisé ces dernières années. Est-ce que 32 signifie vraiment 32 bits, ou est-ce que cela fait référence à l'API Win32 ?

S'il y a la possibilité d'avoir un jour sys.platform comme 'win64', peut-être que cette condition serait plus universelle ?

if sys.platform.startswith('win'):
    ...

Il existe également un autre moyen de détecter Windows dont je suis au courant :

if os.name == 'nt':
    ...

Mais je n'ai jamais vraiment vu dans d'autres codes l'utilisation de cette dernière.

Quelle est la meilleure façon de procéder alors ?

UPD : J'aimerais éviter d'utiliser des bibliothèques supplémentaires si je le peux. Le fait de devoir installer une bibliothèque supplémentaire pour vérifier que je ne travaille pas dans Windows peut être gênant pour les utilisateurs de Linux.

24voto

Torsten Marek Points 27554

sys.platform sera win32 indépendamment du bitness du système Windows sous-jacent, comme vous pouvez le voir dans PC/pyconfig.h (à partir de la distribution des sources de Python 2.6) :

#if defined(MS_WIN64)
/* maintain "win32" sys.platform for backward compatibility of Python code,
   the Win64 API should be close enough to the Win32 API to make this
   preferable */
#       define PLATFORM "win32"

Il est possible de trouver le patch original qui a introduit ce sujet sur le web, qui offre un peu plus d'explications :

La question principale est la suivante : Win64 ressemble-t-il tellement plus à Win32 qu'il n'en diffère que le programmeur Python général ne devrait jamais avoir à faire la différence dans son code Python. Ou, du moins, suffisamment pour que cette différenciation par le scripteur Python soit suffisamment rare pour qu'un autre mécanisme soit suffisant (voire préférable). Actuellement, la réponse est oui. Espérons que MS ne changera pas cette réponse.

2voto

Pekka Klärck Points 703

Notez que vous ne pouvez utiliser ni l'un ni l'autre sys.platform o os.name pour cela sur Jython :

$ jython -c "import sys, os; print sys.platform; print os.name"
java1.6.0_20
java

Je pense qu'il y a un plan dans le projet Jython pour modifier os.name pour signaler le système d'exploitation sous-jacent de la même manière que CPython, mais parce que les gens utilisent os.name == 'java' pour vérifier s'ils sont sur Jython ; ce changement ne peut pas être fait du jour au lendemain. Il existe cependant déjà os._name sur Jython 2.5.x :

$ jython -c "import os; print os._name"
posix

Personnellement, j'ai tendance à utiliser os.sep == '/' avec du code qui doit fonctionner à la fois sur Jython et CPython, et à la fois sur les plateformes Windows et unixy. C'est un peu laid mais ça marche.

1voto

Les avertissements pour Windows/32 et Windows/64 sont les mêmes, ils doivent donc utiliser la même valeur. La seule différence serait, par exemple, dans les cas suivants sys.maxint et ctypes . Si vous avez besoin de faire la distinction entre 32 et 64 sans tenir compte de ce qui se passe alors platform est votre meilleure chance.

1voto

Sridhar Ratnakumar Points 12390

Personnellement, j'utilise platinfo pour détecter la plate-forme sous-jacente.

>>> from platinfo import PlatInfo
>>> pi = PlatInfo()
>>> pi.os
'win64'
>>> pi.arch
'x64'
>>> pi.name()
'win64-x64'

Pour les 32 bits, pi.name() renvoie à win32-x86 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X