Безопасно ли использовать проверку sys.platform == 'win32' на 64-битном Python? - PullRequest
39 голосов
/ 27 января 2010

Обычная проверка, позволяющая различать запуск приложения 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.

Ответы [ 4 ]

35 голосов
/ 27 января 2010

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 не изменит этот ответ.

5 голосов
/ 02 сентября 2010

Обратите внимание, что вы не можете использовать 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, это изменение не может быть сделано за одну ночь. Однако на Jython 2.5.x уже есть os._name:

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

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

5 голосов
/ 27 января 2010

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

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

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

2 голосов
/ 27 января 2010

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

...