13 Вопрос: Как определить, работает ли моя оболочка python в 32-битном или 64-битном режиме на OS X?

вопрос создан в Wed, May 29, 2013 12:00 AM

Мне нужен способ узнать, в каком режиме оболочка находится внутри оболочки.

Я пытался просмотреть модуль платформы , но, похоже, он только говорит вам о «битовой архитектуре и формате связывания, используемых для исполняемого файла»: двоичный файл скомпилирован как 64-битный, хотя (я работаю на OS X 10.6), поэтому он, кажется, всегда сообщает о 64-битном, хотя я использую методы описанный здесь для принудительного включения 32-битного режима) . р>     

360
  1. Просто из интереса: зачем вам это знать?
    2009-09-10 15: 18: 15Z
  2. У меня проблемы со сборкой и загрузкой некоторых модулей в OS X 10.6. В частности, pysco, который жалуется, что я работаю в 64-битном режиме. Это также относится к virtualenv, поэтому мне нужно разобраться с некоторыми дополнительными сложностями ...
    2009-09-10 17: 24: 33Z
  3. Я хотел бы знать, потому что, когда я использую что-то вроде PyInstaller, чтобы создать автономный двоичный дистрибутив (чтобы дать пользователям, которые могут не иметь (правильную версию ) Python установлен, двоичный файл, который я создаю, будет 32/64 битным в зависимости от Python, с которым я запускаю PyInstaller. В идеале я думаю, что я хотел бы автоматически назвать получившийся двоичный файл /архив с «32» или «64» в имя файла, вместо того, чтобы вручную переименовывать файлы в зависимости от того, откуда я выполняю команду make.
    2016-01-19 04: 48: 08Z
13 ответов                              13                         

ОБНОВЛЕНО: Один из способов - посмотреть на 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
    

363
2012-09-22 00: 18: 24Z
  1. Использование sys.maxint не поможет обнаружить 64-битный Python при работе в Windows (см. здесь ). Вместо этого используйте struct.calcsize ("P") для кроссплатформенного решения.
    2011-03-29 17: 42: 43Z
  2. Интересно. Работает ли sys.maxsize для 64-битной Windows?
    2011-03-29 18: 19: 19Z
  3. Да, sys.maxsize работает для 64-битной Windows.
    2011-03-30 14: 36: 20Z
  4. Иньон, это правда, но это не то, что задал вопрос. И на тех процессорах, где можно запускать, скажем, 32-битные или 64-битные двоичные файлы, арка машины обычно не совсем подходит для программы на Python; важно то, как работает сам интерпретатор Python.
    2015-06-23 07: 18: 16Z
  5. ВклWindows cmd, вам нужно поместить двойные кавычки снаружи и одинарные кавычки внутри, иначе это вызовет синтаксическую ошибку. Это, вероятно, потому, что окна думают, что пробелы между одинарными кавычками все еще являются разделителями аргументов. Может быть полезно скорректировать этот ответ с учетом этого факта.
    2016-12-28 20: 38: 51Z

При запуске интерпретатора 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. Работает для моей конкретной настройки.

    
225
2016-01-31 18: 27: 43Z
  1. так это что? 64-битный питон или 32-битный питон?
    2013-02-28 05: 06: 15Z
  2. @ phpJs 64-битный из-за [MSC v.1500 64 bit (AMD64)]
    2013-08-05 12: 34: 00Z
  3. К сожалению, работает только для версий Python для Windows. Моя установка 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
    2014-08-13 16: 12: 26Z
  4. Также не работает в Linux.
    2014-09-08 16: 34: 01Z
  5. На cygwin вы получите этот ответ: Python 2.7.8 (default, Jul 25 2014, 14:04:36) [GCC 4.8.3] on cygwin
    2014-11-10 04: 15: 56Z

В основном вариант ответа Мэтью Маршалла (со структурой из std.library):

import struct
print struct.calcsize("P") * 8
    
169
2009-09-10 18: 11: 27Z
  1. Имхо, лучше, чем версия ctypes - работает даже со старым Python.
    2010-05-02 21: 34: 19Z
  2. Очень полезно, может использоваться в одной строке. $python -c 'import struct; print struct.calcsize ("P") * 8 '
    2012-04-23 09: 43: 29Z
  3. лучше печатать (struct.calcsize ("P") * 8).
    2019-06-05 02: 47: 24Z

Попробуйте использовать ctypes, чтобы получить размер пустого указателя:

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

Это будет 4 для 32 бит или 8 для 64 бит.

    
70
2014-11-10 04: 15: 07Z
  1. Это тоже работает, хотя и имеет небольшой недостаток из-за ненужного импорта и загрузки модуля, если в противном случае вам не нужны ctypes: модуль sys, otoh, компилируется в интерпретатор.
    2009-09-10 16: 32: 32Z
  2. , пожалуйста, помогите мне понять: при моей установке 64b python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)' возвращает 8 . Или это должно быть python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp) * 8'?
    2012-07-14 11: 11: 48Z
  3. Функция возвращает размер в байтах а> (4 или 8). Если вам нужен размер в битах (32 или 64) вы должны умножить на 8. b_is_python_64bit = (ctypes.sizeof (ctypes.c_voidp) == 8)
    2012-09-26 12: 44: 53Z
  4. Просто позвоните python -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
    2014-10-27 20: 22: 58Z

Открыть консоль 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
    
40
2016-09-17 00: 45: 22Z
  1. модуль patform не всегда надежен, см. документы docs.python.org/2/library/platform.html это также верно для некоторых приложений Windows
    2019-06-13 20: 48: 08Z

Непрограммное решение смотрите в мониторе активности. В нем перечислены архитектуры 64-разрядных процессов как «Intel (64-разрядные)».

    
15
2009-09-27 20: 14: 03Z
  1. Очень хороший альтернативный ответ для тех из нас, кто использует Mac OS 10.x.x Спасибо!
    2010-07-04 04: 04: 39Z

В моей системе Centos Linux я сделал следующее:

1) Запустил интерпретатор Python (я использую 2.6.6)
2) Запустил следующий код:

import platform
print(platform.architecture())

и это дало мне

(64bit, 'ELF')
    
14
2017-09-22 02: 33: 15Z
  1. Разве это решение не было названо OP нерабочим для него?
    2016-02-18 21: 11: 09Z
  2. Это может быть, но это именно то, что мне было нужно; извините за +1 "неправильный ответ", но мне это очень нужно.
    2016-08-03 18: 43: 37Z
  3. Это решение идеально подходит для Solaris 11.
    2017-06-21 05: 48: 02Z

platform.architecture() в заметках говорится:

  

Примечание:   В Mac OS X (и, возможно, на других платформах) исполняемые файлы могут быть универсальными файлами с несколькими архитектурами.

     

Чтобы получить «64-разрядность» текущего интерпретатора, он более надежен   запросить атрибут sys.maxsize:

import sys
is_64bits = sys.maxsize > 2**32
    
9
2018-03-21 18: 49: 21Z

Группировка всего ...

Учитывая, что:

  • Вопрос задается для OSX (у меня старая (и взломанная) виртуальная машина с древней версией Python )
  • Моя основная среда - Win
  • У меня есть только 32-битная версия установлена ​​на Win (и я построил "урезанную" версию на Lnx )

Я собираюсь привести примеры на всех 3 платформах, используя Python3 и Python2 .

  1. Проверьте [Python 3]: sys. maxsize - сравните его с 0x100000000 (2 ** 32): больше для 64 бит , меньше для 32 бит :
    • OSX 9 x64 :
      • Python 2.7.10 x64 :
        >>> import sys
        >>> "Python {:s} on {: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)
        
    • Ubtu 16 x64 .
      • Python 3.5.2 x64 :
        >>> import sys
        >>> "Python {:s} on {: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 {:s} on {: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 {:s} on {: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 {:s} on {: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]: struct. calcsize ( fmt ) , чтобы определить размер объекта, созданный в формате (указатель). Другими словами, определяет размер указателя (sizeof(void*)):
    • OSX 9 x64 :
      • Python 2.7.10 x64 :
        >>> import struct
        >>> truct.calcsize("P") * 8
        64
        
    • Ubtu 16 x64 .
      • Python 3.5.2 x64 :
        >>> import struct
        >>> truct.calcsize("P") * 8
        64
        
      • Python 3.6.4 x86 :
        >>> import struct
        >>> truct.calcsize("P") * 8
        32
        
    • Win 10 x64 .
      • Python 3.5.4 x64 :
        >>> import struct
        >>> truct.calcsize("P") * 8
        64
        
      • Python 3.6.2 x86 :
        >>> import struct
        >>> truct.calcsize("P") * 8
        32
        


  1. Используйте [Python 3.5]: 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
        
    • Ubtu 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]: платформа. архитектура ( исполняемый файл = sys.executable, bits = '', linkage = '' ) !!! НЕ надежен в OSX !!! из-за формата многоархивированного исполняемого файла (или .dylib ) (в некоторых случаях используется # 2 . ):
    • OSX 9 x64 :
      • Python 2.7.10 x64 :
        >>> import platform
        >>> platform.architecture()
        ('64bit', '')
        
    • Ubtu 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. Обходное решение Lame ( gainarie ) - вызывает внешнюю команду ( [man7]: FILE (1) ) через [Python 3]: os. system ( команда ) . Применяются ограничения # 4. (иногда это может даже не работать):
    • OSX 9 x64 :
      • Python 2.7.10 x64 :
        >>> import os
        >>> os.system("file {:s}".format(os.path.realpath(sys.executable)))
        /opt/OPSWbuildtools/2.0.6/bin/python2.7.global: Mach-O 64-bit executable x86_64
        
    • Ubtu 16 x64 .
      • Python 3.5.2 x64 :
        >>> import os
        >>> os.system("file {: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 {: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 .
      • Утилита file отсутствует, есть и другие сторонние инструменты, которые можно использовать, но я не буду настаивать на них


Win специфично:

  1. Проверьте env vars (например, % PROCESSOR_ARCHITECTURE% (или другие)) через [Python 3]: os. environment :
    • 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]: sys. версия (также отображается в 1 st строке при запуске переводчика)
    • Проверьте # 1.
8
2019-01-14 13: 31: 11Z

struct.calcsize("P") возвращает размер байтов, необходимых для хранения одного указателя. В 32-битной системе он вернул бы 4 байта. В 64-битной системе он вернул бы 8 байтов.

Таким образом, следующий код вернет 32, если вы работаете с 32-битным питоном, и 64, если вы работаете с 64-битным питоном:

Python 2

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

Python 3

import struct;print(struct.calcsize("P") * 8)
    
7
2017-01-06 01: 46: 41Z
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.
>>>

после нажатия на python в cmd

    
3
2014-02-19 05: 42: 10Z
import sys
print(sys.version)

3.5.1 (v3.5.1: 37a07cee5969, 6 декабря 2015, 01:54:25) [MSC v.1900 64 бит (AMD64) ]

    
3
2017-09-12 07: 21: 09Z
  1. Не применяется к OSX .
    2018-09-25 21: 04: 16Z

Архитектура платформы не является надежным способом. Вместо нас:

$ 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)
    
1
2017-11-14 05: 46: 13Z
источник размещен Вот