2010-01-27 7 views
35

Обычная проверка дифференцироваться между управлением Python-приложения на Windows, и на других ОС (Linux обычно) является использование условно:Можно ли использовать sys.platform == 'win32' для проверки на 64-битном Python?

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

Но мне интересно, безопасно ли использовать сегодня, когда 64-разрядные Python больше широко используется в последние годы? Действительно ли 32 означает 32-битное, или в основном это относится к Win32 API?

Если есть возможность иметь один день sys.platform как «win64», возможно, такое условие было бы более универсальным?

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

Существует также другой способ обнаружить Windows, я знаю:

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

Но я действительно никогда не видел в другом коде использование последнего.

Каков наилучший способ?

UPD: Я хотел бы избежать использования дополнительных библиотек, если можно. Требование установить дополнительную библиотеку, чтобы проверить, что я работаю не в Windows, может раздражать пользователей Linux.

+1

Это очень хороший вопрос. Спасибо. – jathanism

ответ

29

sys.platform будет win32 независимо от разрядности базовой системы Windows, как вы можете видеть в PC/pyconfig.h (от распределения 2,6 источника Python):

#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" 

Можно найти original patch что введенное это на в Интернете, который предлагает немного больше объяснений:

Главный вопрос: является ли Win64 гораздо более похожим на Win32, чем отличается от него, что обычный программист на Python вообще никогда не должен чтобы сделать дифференциацию в его коде Python. Или, по крайней мере, достаточно, чтобы такая дифференциация с помощью скрипта Python была достаточно редка, достаточная (даже предпочтительная). В настоящее время ответ «да». Надеюсь, MS не изменит этот ответ.

+1

Спасибо, вот что мне нужно. – bialix

+0

Добро пожаловать! –

1

Предостережения для Windows/32 и Windows/64 одинаковы, поэтому они должны использовать одно и то же значение. Единственное различие было бы, например, в том, sys.maxint и ctypes. Если вам нужно различать 32 и 64, то тогда ваш лучший выбор - platform.

+0

Я не совсем понимаю ваш ответ. Вы говорите, что 64-битная Python построена с использованием win32 в sys.platform? Настоящая проблема для меня в том, что у меня нет 64-битной машины, чтобы проверить это предположение. – bialix

+0

В сборке Windows/64 используется «win32». (очевидно, что другие 64-разрядные операционные системы этого не делают) –

3

Лично я использую platinfo для обнаружения базовой платформы.

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

для 32-битных, pi.name() возвращает win32-x86.

+2

Я бы предпочел избежать использования дополнительных зависимостей, если я смогу получить то, что мне нужно от ванильного Python. – bialix

3

Обратите внимание, что вы не можете использовать либо sys.platform или os.name для этого на Jython:

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

Я думаю, что есть план в проекте Jython изменить os.name сообщить основную ОС подобно тому, как CPython, а потому, что люди используют os.name == 'java', чтобы проверить, находятся ли они на Jython, это изменение невозможно сделать за одну ночь. Существует, однако, уже os._name на Jython 2.5.х:

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

Лично я предпочитаю использовать os.sep == '/' с кодом, который должен работать как на Jython и CPython, а также как на Windows, и unixy платформ. Это несколько уродливо, но работает.

+0

Для IronPython 'sys.platform == 'cli''. – Gabe