web-dev-qa-db-ja.com

64ビットPythonでsys.platform == 'win32'チェックを使用しても安全ですか?

Windowsと他のOS(通常はLinux)で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ユーザーにとって煩わしいかもしれません。

43
bialix

sys.platform(Python 2.6ソース配布から)からわかるように、基盤となるWindowsシステムのビット数に関係なくwin32PC/pyconfig.hになります。

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

これをWebで紹介した 元のパッチ を見つけることができます。これはもう少し説明があります。

主な質問は次のとおりです。Win64はWin32とは異なるというよりもはるかに似ているため、一般的な一般的なPythonプログラマーは自分のPythonコード。または、少なくとも、Pythonスクリプト作成者によるそのような区別は、他の提供されたメカニズムで十分であるほどまれです(さらに望ましい)。現在、答えはイエスです。うまくいけば。 MSはこの答えを変更しません。

40
Torsten Marek

個人的には、基盤となるプラットフォームを検出するために platinfo を使用します。

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

32ビットの場合、pi.name()は_win32-x86_を返します。

6

Jythonでは、これにsys.platformまたはos.nameのいずれも使用できないことに注意してください。

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

Jythonプロジェクトには、CPythonと同様に基盤となるOSを報告するためにos.nameを変更する計画があると思いますが、人々はos.name == 'Java'を使用して、Jython上にいるかどうかを確認しているため、この変更を一夜にして行うことはできません。ただし、Jython2.5.xにはすでにos._nameがあります。

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

個人的には、JythonとCPythonの両方、およびWindowsとunixyプラットフォームの両方で実行する必要があるコードでos.sep == '/'を使用する傾向があります。やや醜いですが、機能します。

5
Pekka Klärck

Windows/32とWindows/64の警告は同じであるため、同じ値を使用する必要があります。唯一の違いは、例えばsys.maxintおよびctypes。関係なく32と64を区別する必要がある場合は、platformが最善の策です。