쉘 내에서 쉘이 어떤 모드인지 알 수있는 방법이 필요합니다.
플랫폼 모듈을 살펴 보았지만 "실행 파일에 사용되는 비트 아키텍처 및 링크 형식"에 대해서만 알려줍니다. 바이너리는 64 비트로 컴파일되지만 (OS X 10.6에서 실행 중) 32 비트 모드를 강제하기 위해 여기 에 설명 된 방법을 사용하더라도 항상 64 비트를보고하는 것 같습니다 .
쉘 내에서 쉘이 어떤 모드인지 알 수있는 방법이 필요합니다.
플랫폼 모듈을 살펴 보았지만 "실행 파일에 사용되는 비트 아키텍처 및 링크 형식"에 대해서만 알려줍니다. 바이너리는 64 비트로 컴파일되지만 (OS X 10.6에서 실행 중) 32 비트 모드를 강제하기 위해 여기 에 설명 된 방법을 사용하더라도 항상 64 비트를보고하는 것 같습니다 .
답변:
한 가지 방법은 여기 에 설명 된 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
파이썬 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
BTW, 당신은 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 비트 파이썬을 의미한다. 내 특정 설정에서 작동합니다.
[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)'
반환합니다 . 아니면해야 합니까? 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')"
파이썬 콘솔 열기 :
import platform
platform.architecture()[0]
플랫폼에 따라 '64bit'또는 '32bit'가 표시되어야합니다.
또는 ( 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
명령 줄에서. 버전을 반환해야합니다.
import sys
print(sys.version)
3.5.1 (v3.5.1 : 37a07cee5969, 2015 년 12 월 6 일, 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 비트 모드"를 식별하기위한 목적이 무엇인지 명확히해야합니다.