PythonシェルがOS Xで32ビットモードと64ビットモードのどちらで実行されているかを確認するにはどうすればよいですか?


420

シェル内からシェルがどのモードにあるかを知る方法が必要です。

私はプラットフォームモジュールを調べてみましたが、「実行可能ファイルに使用されるビットアーキテクチャとリンケージフォーマットについて」のみを伝えているようです。ただし、バイナリは64ビットとしてコンパイルされています(OS X 10.6で実行しています)。ここで説明する方法を使用して32ビットモードを強制している場合でも、常に64ビットを報告するようです)。


1
ちょうど興味がない:なぜあなたは知る必要があるのですか?
Lennart Regebro、2009

2
OS X 10.6でいくつかのモジュールのビルドとロードに問題があります。具体的には、64ビットモードで実行していると不平を言っているpysco。これもvirtualenvの下にあるため、対処する必要があるいくつかの追加の複雑な問題があります...
jkp

2
PyInstallerのようなものを使用して(適切なバージョンの)Pythonがインストールされていない可能性のあるユーザーに提供するスタンドアロンのバイナリバイナリを作成すると、生成されるバイナリは32/64ビットに依存するため、知りたいPythonでPyInstallerを実行しています。理想的には、結果のバイナリ/アーカイブファイルにファイル名に「32」または「64」を自動的に付けたいと思います。場所に応じて手動でファイルの名前を変更する必要はありません。 「メイク」コマンドを実行します。
ジョナサン・ハートリー

回答:


411

1つの方法は、ここにsys.maxsize記載されているように確認することです

$ python-32 -c 'import sys;print("%x" % sys.maxsize, sys.maxsize > 2**32)'
('7fffffff', False)
$ python-64 -c 'import sys;print("%x" % sys.maxsize, sys.maxsize > 2**32)'
('7fffffffffffffff', True)

sys.maxsizePython 2.6で導入されました。古いシステムのテストが必要な場合は、この少し複雑なテストがすべてのPython 2および3リリースで機能するはずです。

$ python-32 -c 'import struct;print( 8 * struct.calcsize("P"))'
32
$ python-64 -c 'import struct;print( 8 * struct.calcsize("P"))'
64

ところで、あなたはplatform.architecture()これに使いたくなるかもしれません。残念ながら、特にOS Xユニバーサルバイナリの場合、その結果は必ずしも信頼できるとは限りません。

$ arch -x86_64 /usr/bin/python2.6 -c 'import sys,platform; print platform.architecture()[0], sys.maxsize > 2**32'
64bit True
$ arch -i386 /usr/bin/python2.6 -c 'import sys,platform; print platform.architecture()[0], sys.maxsize > 2**32'
64bit False

14
Windowsを実行している場合、sys.maxintを使用しても64ビットPythonを検出できません(ここを参照)。代わりに、クロスプラットフォームのソリューションにはstruct.calcsize( "P")を使用してください。
ルークムーア

ご確認いただきありがとうございます。私は、実質的に今、文書化を示すために答えを改訂しましたsys.maxsizePythonの2.6+のためのテストとstructで使用するテストplatformものPython 2の古いバージョンのために働くモジュール
ネッドDeily

これはIronPythonでは機能しません。32ビットと64ビットの両方のIronPythonでsys.maxsizeが2 ** 31です
Meh

4
イノン、それは本当ですが、それは質問が求めたものではありません。また、たとえば32ビットまたは64ビットのバイナリを実行できるCPUでは、マシンのアーチは通常、Pythonプログラムに関連するすべてのものではありません。重要なのは、Pythonインタープリター自体が実行されているアーチです。
Ned Deily 2015年

6
Windows cmdでは、二重引用符を外側に、単一引用符を内側に配置する必要があります。そうしないと、構文エラーが発生します。これはおそらく、Windowsが単一引用符の間のスペースを引数の区切り文字と見なしているためです。この事実に対応するために、この回答を調整すると役立つ場合があります。
Steven Bluen、2016

255

ターミナル/コマンドラインでPythonインタープリターを起動すると、次のような行も表示される場合があります。

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32

ここ[MSC v.1500 64 bit (AMD64)]で、64ビットのPythonを意味します。私の特定のセットアップで動作します。


6
これは何ですか?64ビットPythonまたは32ビットPython?
phpJs 2013

9
@phpJs 64ビットのため[MSC v.1500 64 bit (AMD64)]
Eduard Florinescu

19
残念ながら、WindowsバージョンのPythonでのみ機能します。私のOSXインストールが戻るPython 2.7.8 (v2.7.8:ee879c0ffa11, Jun 29, 2014, 21:07:35) [GCC 4.2.1 (Apple In. build 5666) (dot 3)] on darwin
aodj

6
cygwinの上では、この答えを得る:Python 2.7.8 (default, Jul 25 2014, 14:04:36) [GCC 4.8.3] on cygwin
Jonno_FTW

1
この情報は、を呼び出してコードで確認できますsys.version。私は例として('3.4.4 |Continuum Analytics, Inc.| (default, Feb 16 2016, 09:54:04) [MSC ' 'v.1600 64 bit (AMD64)]')2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]
otterb

191

基本的には、Matthew Marshallの回答のバリアント(std.libraryの構造体を使用):

import struct
print struct.calcsize("P") * 8

1
Imho、ctypesバージョンより良い-古いPythonでも動作します。
yk4ever

7
非常に便利で、1行で使用できます。$ python -c 'import struct; print struct.calcsize( "P")* 8 '
Sun Liwen

1
print(struct.calcsize( "P")* 8)の方が優れています。
HelloWorld

2
そのためのpython3 onelinerコピー&ペースト:python -c "import struct; print(struct.calcsize('P')*8)"
Neinstein

78

ctypesを使用してvoidポインターのサイズを取得してみてください。

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

32ビットの場合は4、64ビットの場合は8になります。


1
これも機能しますが、ctypesが必要ない場合は、不要なインポートとモジュールの読み込みというわずかな欠点がある可能性があります。sysモジュールotohがインタープリターにコンパイルされます。
ネッドデイリー

私の理解を助けてください:私の64bインストールでpython -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)'8が返されます。それともそうpython -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp) * 8'でしょうか?
lukmdo

関数はサイズをバイト単位(4または8)で返します。ビット単位のサイズ(32または64)が必要な場合は、8を掛ける必要があります。b_is_python_64bit=(ctypes.sizeof(ctypes.c_voidp)== 8)
phobie

1
ただ電話をかけるpython -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
14年

55

Pythonコンソールを開きます。

import platform
platform.architecture()[0]

プラットフォームに応じて「64ビット」または「32ビット」を表示する必要があります。

あるいはOS Xバイナリの場合):

import sys
sys.maxsize > 2**32 
# it should display True in case of 64bit and False in case of 32bit

patformモジュールは常に信頼できるとは限りませんdocs docs.python.org/2/library/platform.htmlを参照してくださいこれは一部のWindowsアプリケーションにも当てはまります
GM

18

プログラム以外のソリューションについては、アクティビティモニターを確認してください。64ビットプロセスのアーキテクチャを「Intel(64ビット)」として示しています。


1
Mac OS 10.xxを使用している私たちにとって非常に良い代替回答ありがとうございます!
mkelley33

16

Centos Linuxシステムで、私は次のことを行いました

。1)Pythonインタープリターを開始しました(私は2.6.6を使用しています)
2)次のコードを実行しました。

import platform
print(platform.architecture())

そしてそれは私に与えました

(64bit, 'ELF')

このソリューションは、OPによって彼にとって機能しないと説明されていませんか?
Antony Hatchkins、2016

そうかもしれませんが、これはまさに私が必要としたものです。「間違った答え」を+1して申し訳ありませんが、これはひどく必要でした。
UnsettlingTrend 2016

このソリューションは、Solaris 11用に最適です
スティーヴン・ウルフ

11

platform.architecture() ノートは言う:

注:Mac OS X(およびおそらく他のプラットフォーム)では、実行可能ファイルは複数のアーキテクチャを含むユニバーサルファイルである場合があります。

現在のインタプリタの「64ビット」を取得するには、sys.maxsize属性をクエリする方が信頼性が高くなります。

import sys
is_64bits = sys.maxsize > 2**32

11

すべてをグループ化しています...

それを考慮して:

  • OSXについて質問されます(私は古い(そしてクラックされた)VMを古いPythonバージョンで使用しています)
  • 私の主な環境はWinです
  • Winにインストールされているのは32ビットバージョンだけです(そしてLnxに「不自由な」バージョンを構築しました

Python 3およびPython 2を使用して、3つのプラットフォームすべてで例を示します。

  1. [Python 3.Docs]:sysを確認してくださいmaxsize値- 0x1000000002 ** 32)と比較します:64ビットの場合は大きく、32 ビットの場合は小さくなります。
    • OSX 9 x64
      • Python 2.7.10 x64
        >>> import sys
        >>> "Python {0:s} on {1:s}".format(sys.version, sys.platform)
        'Python 2.7.10 (default, Oct 14 2015, 05:51:29) \n[GCC 4.8.2] on darwin'
        >>> hex(sys.maxsize), sys.maxsize > 0x100000000
        ('0x7fffffffffffffff', True)
    • Ubuntu 16 x64
      • Python 3.5.2 x64
        >>> import sys
        >>> "Python {0:s} on {1:s}".format(sys.version, sys.platform)
        'Python 3.5.2 (default, Nov 23 2017, 16:37:01) \n[GCC 5.4.0 20160609] on linux'
        >>> hex(sys.maxsize), sys.maxsize > 0x100000000
        ('0x7fffffffffffffff', True)
      • Python 3.6.4 x86
        >>> import sys
        >>> "Python {0:s} on {1:s}".format(sys.version, sys.platform)
        'Python 3.6.4 (default, Apr 25 2018, 23:55:56) \n[GCC 5.4.0 20160609] on linux'
        >>> hex(sys.maxsize), sys.maxsize > 0x100000000
        ('0x7fffffff', False)
    • Win 10 x64
      • Python 3.5.4 x64
        >>> import sys
        >>> "Python {0:s} on {1:s}".format(sys.version, sys.platform)
        'Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32'
        >>> hex(sys.maxsize), sys.maxsize > 0x100000000
        ('0x7fffffffffffffff', True)
      • Python 3.6.2 x86
        >>> import sys
        >>> "Python {0:s} on {1:s}".format(sys.version, sys.platform)
        'Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)] on win32'
        >>> hex(sys.maxsize), sys.maxsize > 0x100000000
        ('0x7fffffff', False)


  1. 使用[Pythonの3.Docs]:構造体。calcsizeformatは、(ポインター)形式によって生成されるオブジェクトのサイズを決定します。つまり、ポインタのサイズを決定します(sizeof(void*)):
    • OSX 9 x64
      • Python 2.7.10 x64
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
    • Ubuntu 16 x64
      • Python 3.5.2 x64
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
      • Python 3.6.4 x86
        >>> import struct
        >>> struct.calcsize("P") * 8
        32
    • Win 10 x64
      • Python 3.5.4 x64
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
      • Python 3.6.2 x86
        >>> import struct
        >>> struct.calcsize("P") * 8
        32


  1. 使用[Pythonの3.Docs]:ctypes - Pythonのための外部関数ライブラリ。また、ポインタ(sizeof(void*))のサイズを決定することにもなります。注として、ctypes#2を使用します。(このタスクでは必ずしも必要ではありません)"$ {PYTHON_SRC_DIR} / Lib / ctypes / __ init__.py"を介して#15あたり):
    • OSX 9 x64
      • Python 2.7.10 x64
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        64
    • Ubuntu 16 x64
      • Python 3.5.2 x64
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        64
      • Python 3.6.4 x86
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        32
    • Win 10 x64
      • Python 3.5.4 x64
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        64
      • Python 3.6.2 x86
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        32


  1. [Python 3.Docs]:プラットフォーム。アーキテクチャ実行可能ファイル= sys.executable、ビット= ''、リンケージ= '' !!! OSXでは信頼できません!!! マルチアーチ実行可能(または.dylib)形式のため(場合によっては#2を使用します):
    • OSX 9 x64
      • Python 2.7.10 x64
        >>> import platform
        >>> platform.architecture()
        ('64bit', '')
    • Ubuntu 16 x64
      • Python 3.5.2 x64
        >>> import platform
        >>> platform.architecture()
        ('64bit', 'ELF')
      • Python 3.6.4 x86
        >>> import platform
        >>> platform.architecture()
        ('32bit', 'ELF')
    • Win 10 x64
      • Python 3.5.4 x64
        >>> import platform
        >>> platform.architecture()
        ('64bit', 'WindowsPE')
      • Python 3.6.2 x86
        >>> import platform
        >>> platform.architecture()
        ('32bit', 'WindowsPE')


  1. ラメ回避策(gainarie)- [Python 3.Docs]:osを介して外部コマンド([man7]:FILE(1))を呼び出します。システムコマンド#4の制限適用します(時にはうまくいかない場合もあります):
    • OSX 9 x64
      • Python 2.7.10 x64
        >>> import os
        >>> os.system("file {0:s}".format(os.path.realpath(sys.executable)))
        /opt/OPSWbuildtools/2.0.6/bin/python2.7.global: Mach-O 64-bit executable x86_64
    • Ubuntu 16 x64
      • Python 3.5.2 x64
        >>> import os
        >>> os.system("file {0:s}".format(os.path.realpath(sys.executable)))
        /usr/bin/python3.5: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=59a8ef36ca241df24686952480966d7bc0d7c6ea, stripped
      • Python 3.6.4 x86
        >>> import os
        >>> os.system("file {0:s}".format(os.path.realpath(sys.executable)))
        /home/cfati/Work/Dev/Python-3.6.4/python: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=5c3d4eeadbd13cd91445d08f90722767b0747de2, not stripped
    • Win 10 x64
      • ファイルユーティリティは存在しません、使用できる他のサードパーティツールがありますが、私はそれらを主張するつもりはありません


特定の勝利

  1. [Python 3.Docs]を介して環境変数(%PROCESSOR_ARCHITECTURE%(またはその他))を確認します。環境
    • Win 10 x64
      • Python 3.5.4 x64
        >>> import os
        >>> os.environ["PROCESSOR_ARCHITECTURE"]
        'AMD64'
      • Python 3.6.2 x86
        >>> import os
        >>> os.environ["PROCESSOR_ARCHITECTURE"]
        'x86'


  1. [Python 3.Docs]:sys。バージョン(インタープリターの開始時に1目に表示されます
    • #1を確認してください

7

struct.calcsize("P")単一のポインタを格納するために必要なバイトのサイズを返します。32ビットシステムでは、4バイトを返します。64ビットシステムでは、8バイトを返します。

したがって、3232ビットのpythonを64実行している場合、および64 ビットのpythonを実行している場合、次のコードが返されます。

Python 2

import struct;print struct.calcsize("P") * 8

Python 3

import struct;print(struct.calcsize("P") * 8)

5

python -VVコマンドラインでaを実行します。バージョンを返す必要があります。


これは、Python内でそれを行う方法を示していません。
ParkerD

これは、質問に答えるために必要な情報を提供していないようです
Dmitri Zaitsev

4
C:\Users\xyz>python

Python 2.7.6 (default, Nov XY ..., 19:24:24) **[MSC v.1500 64 bit (AMD64)] on win
32**
Type "help", "copyright", "credits" or "license" for more information.
>>>

cmdでpythonを打った後


4
import sys
print(sys.version)

3.5.1(v3.5.1:37a07cee5969、Dec 6 2015、01:54:25)[MSC v.1900 64ビット(AMD64) ]


OSXには適用されません。
CristiFati


2

32ビットの場合は32を返し、64ビットの場合は64を返します

import struct
print(struct.calcsize("P") * 8)

1

プラットフォームアーキテクチャは信頼できる方法ではありません。代わりに:

$ arch -i386 /usr/local/bin/python2.7
Python 2.7.9 (v2.7.9:648dcafa7e5f, Dec 10 2014, 10:10:46)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import platform, sys
>>> platform.architecture(), sys.maxsize
(('64bit', ''), 2147483647)
>>> ^D
$ arch -x86_64 /usr/local/bin/python2.7
Python 2.7.9 (v2.7.9:648dcafa7e5f, Dec 10 2014, 10:10:46)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import platform, sys
>>> platform.architecture(), sys.maxsize
(('64bit', ''), 9223372036854775807)

0

platform.architecture() 問題があります(そして高価です)。

sys.maxsize > 2**32Py2.6以降で便利にテストしてください。

これは実際の(デフォルトの)ポインターサイズの信頼できるテストであり、少なくともPy2.3以降では互換性がありますstruct.calcsize('P') == 8。また:ctypes.sizeof(ctypes.c_void_p) == 8

注:-mx3264ビットアーキテクチャのアプリケーションであるgccオプションなどでビルドすることもできますが、デフォルトとして32ビットポインターを使用します(メモリと速度を節約します)。'sys.maxsize = ssize_t'は、Cポインターのサイズを厳密に表していない可能性があります(通常、それは2**31 - 1とにかく)。また、コードとデータのポインタサイズが異なるシステムがありました。「32ビットモードまたは64ビットモード」を見分ける目的は何であるかを明確にする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.