Подтвердить что ты не робот

Можно ли использовать 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.

4b9b3361

Ответ 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 - ваш лучший выбор.