Можно ли использовать sys.platform == 'win32' для проверки на 64-битном Python?
Обычная проверка отличия между запуском Python-приложения в Windows и других ОС (обычно Linux) заключается в использовании условного:
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
sys.platform
будет win32
независимо от битности базовой системы Windows, как вы можете видеть в PC/pyconfig.h
(из исходного источника 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"
Возможно найти исходный патч который представил это в Интернете, что дает немного больше объяснений:
Основной вопрос заключается в следующем: Win64 намного больше похож на Win32, чем отличающийся от него, что обычный программист на Python вообще не должен делать дифференциацию в своем коде Python. Или, по крайней мере, достаточно, чтобы такая дифференциация с помощью скрипта Python была достаточно редка, достаточная (даже предпочтительная). В настоящее время ответ "да". Надеюсь, MS не изменит этот ответ.
Ответ 2
Лично я использую platinfo для обнаружения базовой платформы.
>>> from platinfo import PlatInfo
>>> pi = PlatInfo()
>>> pi.os
'win64'
>>> pi.arch
'x64'
>>> pi.name()
'win64-x64'
Для 32-разрядной версии pi.name()
возвращает win32-x86
.
Ответ 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.x:
$ jython -c "import os; print os._name"
posix
Лично я склонен использовать os.sep == '/'
с кодом, который должен запускаться как на Jython, так и на CPython, и на платформах Windows и unixy. Это несколько уродливо, но работает.
Ответ 4
Оговорки для Windows/32 и Windows/64 одинаковы, поэтому они должны использовать одно и то же значение. Единственное различие было бы, например, в том, sys.maxint
и ctypes
. Если вам нужно различать 32 и 64, то platform
- ваш лучший выбор.