シェル内からシェルがどのモードにあるかを知る方法が必要です。
私はプラットフォームモジュールを調べてみましたが、「実行可能ファイルに使用されるビットアーキテクチャとリンケージフォーマットについて」のみを伝えているようです。ただし、バイナリは64ビットとしてコンパイルされています(OS X 10.6で実行しています)。ここで説明する方法を使用して32ビットモードを強制している場合でも、常に64ビットを報告するようです)。
シェル内からシェルがどのモードにあるかを知る方法が必要です。
私はプラットフォームモジュールを調べてみましたが、「実行可能ファイルに使用されるビットアーキテクチャとリンケージフォーマットについて」のみを伝えているようです。ただし、バイナリは64ビットとしてコンパイルされています(OS X 10.6で実行しています)。ここで説明する方法を使用して32ビットモードを強制している場合でも、常に64ビットを報告するようです)。
回答:
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.maxsize
Python 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
sys.maxsize
Pythonの2.6+のためのテストとstruct
で使用するテストplatform
ものPython 2の古いバージョンのために働くモジュール
ターミナル/コマンドラインで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を意味します。私の特定のセットアップで動作します。
[MSC v.1500 64 bit (AMD64)]
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
Python 2.7.8 (default, Jul 25 2014, 14:04:36) [GCC 4.8.3] on cygwin
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)]
基本的には、Matthew Marshallの回答のバリアント(std.libraryの構造体を使用):
import struct
print struct.calcsize("P") * 8
python -c "import struct; print(struct.calcsize('P')*8)"
ctypesを使用してvoidポインターのサイズを取得してみてください。
import ctypes
print ctypes.sizeof(ctypes.c_voidp)
32ビットの場合は4、64ビットの場合は8になります。
python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)'
は8が返されます。それともそうpython -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp) * 8'
でしょうか?
python -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
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
Centos Linuxシステムで、私は次のことを行いました
。1)Pythonインタープリターを開始しました(私は2.6.6を使用しています)
2)次のコードを実行しました。
import platform
print(platform.architecture())
そしてそれは私に与えました
(64bit, 'ELF')
platform.architecture()
ノートは言う:
注:Mac OS X(およびおそらく他のプラットフォーム)では、実行可能ファイルは複数のアーキテクチャを含むユニバーサルファイルである場合があります。
現在のインタプリタの「64ビット」を取得するには、sys.maxsize属性をクエリする方が信頼性が高くなります。
import sys
is_64bits = sys.maxsize > 2**32
すべてをグループ化しています...
それを考慮して:
Python 3およびPython 2を使用して、3つのプラットフォームすべてで例を示します。
0x100000000
(2 ** 32
)と比較します:64ビットの場合は大きく、32 ビットの場合は小さくなります。
>>> 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)
>>> 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)
>>> 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)
>>> 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)
>>> 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)
sizeof(void*)
):
>>> import struct >>> struct.calcsize("P") * 8 64
>>> import struct >>> struct.calcsize("P") * 8 64
>>> import struct >>> struct.calcsize("P") * 8 32
>>> import struct >>> struct.calcsize("P") * 8 64
>>> import struct >>> struct.calcsize("P") * 8 32
sizeof(void*)
)のサイズを決定することにもなります。注として、ctypesは#2を使用します。(このタスクでは必ずしも必要ではありません)"$ {PYTHON_SRC_DIR} / Lib / ctypes / __ init__.py"を介して(行#15あたり):
>>> import ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 64
>>> import ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 64
>>> import ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 32
>>> import ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 64
>>> import ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 32
>>> import platform >>> platform.architecture() ('64bit', '')
>>> import platform >>> platform.architecture() ('64bit', 'ELF')
>>> import platform >>> platform.architecture() ('32bit', 'ELF')
>>> import platform >>> platform.architecture() ('64bit', 'WindowsPE')
>>> import platform >>> platform.architecture() ('32bit', 'WindowsPE')
>>> 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
>>> 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
>>> 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
>>> import os >>> os.environ["PROCESSOR_ARCHITECTURE"] 'AMD64'
>>> import os >>> os.environ["PROCESSOR_ARCHITECTURE"] 'x86'
python -VV
コマンドラインでaを実行します。バージョンを返す必要があります。
import sys
print(sys.version)
3.5.1(v3.5.1:37a07cee5969、Dec 6 2015、01:54:25)[MSC v.1900 64ビット(AMD64) ]
プラットフォームアーキテクチャは信頼できる方法ではありません。代わりに:
$ 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)
platform.architecture()
問題があります(そして高価です)。
sys.maxsize > 2**32
Py2.6以降で便利にテストしてください。
これは実際の(デフォルトの)ポインターサイズの信頼できるテストであり、少なくともPy2.3以降では互換性がありますstruct.calcsize('P') == 8
。また:ctypes.sizeof(ctypes.c_void_p) == 8
。
注:-mx32
64ビットアーキテクチャのアプリケーションであるgccオプションなどでビルドすることもできますが、デフォルトとして32ビットポインターを使用します(メモリと速度を節約します)。'sys.maxsize = ssize_t'は、Cポインターのサイズを厳密に表していない可能性があります(通常、それは2**31 - 1
とにかく)。また、コードとデータのポインタサイズが異なるシステムがありました。「32ビットモードまたは64ビットモード」を見分ける目的は何であるかを明確にする必要があります。