파이썬 쉘이 OS X에서 32 비트 또는 64 비트 모드로 실행되고 있는지 어떻게 알 수 있습니까?


420

쉘 내에서 쉘이 어떤 모드인지 알 수있는 방법이 필요합니다.

플랫폼 모듈을 살펴 보았지만 "실행 파일에 사용되는 비트 아키텍처 및 링크 형식"에 대해서만 알려줍니다. 바이너리는 64 비트로 컴파일되지만 (OS X 10.6에서 실행 중) 32 비트 모드를 강제하기 위해 여기설명 된 방법을 사용하더라도 항상 64 비트를보고하는 것 같습니다 .


1
관심이없는 이유 : 왜 알아야합니까?
Lennart Regebro

2
OS X 10.6에서 일부 모듈을 빌드하고로드하는 데 문제가 있습니다. 특히 pysco는 64 비트 모드에서 실행 중이라고 불평합니다. 이것은 또한 virtualenv 아래에 있기 때문에 내가 해결해야 할 추가 합병증이 있습니다 ...
jkp

2
PyInstaller와 같은 것을 사용하여 독립형 바이너리 배포 가능 파일을 만들 때 (올바른 버전의 Python을 설치하지 않은 사용자에게 제공하기 위해 생성하는 바이너리는 32/64 비트이므로) Python에서 PyInstaller를 실행하는 것이 이상적입니다. 이상적으로 필자는 파일 이름을 '32'또는 '64'로 결과 바이너리 / 아카이브 파일의 이름을 자동으로 지정하려고합니다. 'make'명령 실행
Jonathan Hartley

답변:


411

한 가지 방법은 여기 에 설명 된 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

14
sys.maxint를 사용하면 Windows를 실행할 때 64 비트 Python을 감지 할 수 없습니다 ( 여기 참조 ). 대신 크로스 플랫폼 솔루션에 struct.calcsize ( "P")를 사용하십시오.
Luke Moore

확인해 주셔서 감사합니다. 필자는 현재 문서화 된 sys.maxsizePython 2.6+ struct테스트 와 platform이전 버전의 Python 2에서도 작동 하는 모듈에서 사용 된 테스트 를 표시하도록 답변을 크게 수정했습니다 .
Ned Deily

IronPython에서는 작동하지 않습니다. sys.maxsize는 32 비트 및 64 비트 IronPython 모두 2 ** 31
Meh

4
Yinon, 그건 사실이지만 그 질문이 요구 한 것은 아닙니다. 그리고 32 비트 또는 64 비트 바이너리를 실행할 수있는 CPU에서 머신의 아치는 일반적으로 파이썬 프로그램과 관련이있는 것은 아닙니다. 중요한 것은 파이썬 인터프리터 자체가 실행되는 아치입니다.
Ned Deily

6
Windows cmd에서는 큰 따옴표를 외부에, 작은 따옴표를 내부에 넣어야합니다. 그렇지 않으면 구문 오류가 발생합니다. 아마도 Windows가 작은 따옴표 사이의 공백이 여전히 인수 구분 기호라고 생각하기 때문입니다. 해당 사실을 수용하기 위해이 답변을 조정하는 것이 도움이 될 수 있습니다.
Steven Bluen

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 비트 파이썬을 의미한다. 내 특정 설정에서 작동합니다.


6
이게 뭐야? 64 비트 파이썬 또는 32 비트 파이썬?
phpJs

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
ctypes 버전보다 나은 Imho-이전 Python에서도 작동합니다.
yk4ever

7
매우 유용하며 한 줄로 사용할 수 있습니다. $ python -c '가져 오기 구조체; print struct.calcsize ( "P") * 8 '
Sun Liwen

1
print (struct.calcsize ( "P") * 8)이 좋습니다.
HelloWorld

2
그래서 파이썬 3 용 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가 인터프리터로 컴파일됩니다.
Ned Deily

이해하십시오 : 64b 설치시 8을python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)' 반환합니다 . 아니면해야 합니까? 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')"
vitiral

55

파이썬 콘솔 열기 :

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

patform 모듈은 항상 신뢰할 수있는 것은 아닙니다. 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

그럴 수도 있지만 이것이 바로 내가 필요한 것입니다. "답이 잘못되었습니다"+1하여 죄송합니다.
UnsettlingTrend

이 솔루션은 Solaris 11에 적합합니다.
Steven Wolfe

11

platform.architecture() 노트는 말한다 :

참고 : Mac OS X (및 다른 플랫폼)에서 실행 파일은 여러 아키텍처를 포함하는 범용 파일 일 수 있습니다.

현재 인터프리터의 "64 비트"를 얻으려면 sys.maxsize 속성을 쿼리하는 것이 더 안정적입니다.

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

11

모든 것을 그룹화하는 중 ...

고려해 보면:

  • OSX에 대한 질문이 있습니다 ( 고대 Python 버전 의 오래된 VM 이 있습니다 )
  • 내 주요 환경은 승리입니다
  • Win32 비트 버전 만 설치했습니다 ( Lnx 에 "고정 된" 버전을 빌드했습니다 ).

Python 3Python 2를 사용하여 3 개의 플랫폼 모두에서 예를 들어 보겠습니다 .

  1. [Python 3.Docs] : sys를 확인하십시오 . 최대 크기 값- 0x100000000( 2 ** 32)와 비교하십시오 : 64 비트의 경우 더 크고 32 비트의 경우 더 작습니다 :
    • OSX 9 x64 :
      • 파이썬 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)
    • 우분투 16 x64 :
      • 파이썬 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)
      • 파이썬 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)
    • 승리 10 x64 :
      • 파이썬 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)
      • 파이썬 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] : struct를 사용하십시오 . (포인터) 형식으로 생성 된 객체 크기를 결정하려면 calcsize ( format ) . 즉, 포인터 크기 ( sizeof(void*))를 결정합니다 .
    • OSX 9 x64 :
      • 파이썬 2.7.10 x64 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
    • 우분투 16 x64 :
      • 파이썬 3.5.2 x64 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
      • 파이썬 3.6.4 x86 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        32
    • 승리 10 x64 :
      • 파이썬 3.5.4 x64 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
      • 파이썬 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 :
      • 파이썬 2.7.10 x64 :
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        64
    • 우분투 16 x64 :
      • 파이썬 3.5.2 x64 :
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        64
      • 파이썬 3.6.4 x86 :
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        32
    • 승리 10 x64 :
      • 파이썬 3.5.4 x64 :
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        64
      • 파이썬 3.6.2 x86 :
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        32


  1. [Python 3.Docs] : 플랫폼. 아키텍처 ( executable = sys. executable, bits = '', linkage = '' ) !!! OSX에서 신뢰할 수 없습니다 ! 다중 아치 실행 파일 (또는 .dylib ) 형식 (일부 경우 # 2 사용)으로 인해 :
    • OSX 9 x64 :
      • 파이썬 2.7.10 x64 :
        >>> import platform
        >>> platform.architecture()
        ('64bit', '')
    • 우분투 16 x64 :
      • 파이썬 3.5.2 x64 :
        >>> import platform
        >>> platform.architecture()
        ('64bit', 'ELF')
      • 파이썬 3.6.4 x86 :
        >>> import platform
        >>> platform.architecture()
        ('32bit', 'ELF')
    • 승리 10 x64 :
      • 파이썬 3.5.4 x64 :
        >>> import platform
        >>> platform.architecture()
        ('64bit', 'WindowsPE')
      • 파이썬 3.6.2 x86 :
        >>> import platform
        >>> platform.architecture()
        ('32bit', 'WindowsPE')


  1. Lame 해결 방법 ( gainarie )- [Python 3.Docs] : os 를 통해 외부 명령 ( [man7] : FILE (1) )을 호출하십시오. 시스템 ( 명령 ) . # 4 의 한계 . 적용하십시오 (때로는 작동하지 않을 수도 있음).
    • OSX 9 x64 :
      • 파이썬 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
    • 우분투 16 x64 :
      • 파이썬 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
      • 파이썬 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
    • 승리 10 x64 :
      • 파일 유틸리티가 다른 3이며, 존재하지 않는 번째 사용할 수있는 파티 도구,하지만 난 그들 주장하지 않을거야


승리 :

  1. [Python 3.Docs] : os 를 통해 env vars (예 : % PROCESSOR_ARCHITECTURE % (또는 기타))를 확인하십시오 . 환경 :
    • 승리 10 x64 :
      • 파이썬 3.5.4 x64 :
        >>> import os
        >>> os.environ["PROCESSOR_ARCHITECTURE"]
        'AMD64'
      • 파이썬 3.6.2 x86 :
        >>> import os
        >>> os.environ["PROCESSOR_ARCHITECTURE"]
        'x86'


  1. [Python 3.Docs] : sys. 버전 ( 통역사를 시작할 때 첫 번째 에도 표시됨 )
    • # 1을 확인하십시오 .

7

struct.calcsize("P")단일 포인터를 저장하는 데 필요한 바이트 크기를 반환합니다. 32 비트 시스템에서는 4 바이트를 리턴합니다. 64 비트 시스템에서는 8 바이트를 반환합니다.

따라서 3232 비트 파이썬을 64실행 중이고 64 비트 파이썬을 실행 중이면 다음이 반환 됩니다 .

파이썬 2

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

파이썬 3

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

5

를 수행 python -VV명령 줄에서. 버전을 반환해야합니다.


이것은 파이썬 내에서 그것을하는 방법을 보여주지 않습니다.
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에서 파이썬을 친 후


4
import sys
print(sys.version)

3.5.1 (v3.5.1 : 37a07cee5969, 2015 년 12 월 6 일, 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.