Как определить, работает ли моя оболочка python в 32-битном или 64-битном режиме на OS X? - PullRequest
359 голосов
/ 10 сентября 2009

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

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

Ответы [ 13 ]

363 голосов
/ 10 сентября 2009

ОБНОВЛЕНИЕ: Один из способов - посмотреть на 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
225 голосов
/ 10 июня 2012

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

169 голосов
/ 10 сентября 2009

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

import struct
print struct.calcsize("P") * 8
70 голосов
/ 10 сентября 2009

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

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

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

40 голосов
/ 17 сентября 2016

Открытая консоль 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
15 голосов
/ 28 сентября 2009

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

14 голосов
/ 02 января 2015

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

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

import platform
print(platform.architecture())

и это дало мне

(64bit, 'ELF')
9 голосов
/ 12 февраля 2015

platform.architecture() примечания говорят:

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

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

import sys
is_64bits = sys.maxsize > 2**32
8 голосов
/ 27 апреля 2018

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

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

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

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

  1. Проверьте [Python 3]: sys. maxsize value - сравните его с 0x100000000 (2 ** 32): больше для 64bit , меньше для 32bit :
    • 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
        
    • Победа 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 " (около line # 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
        
    • Выиграть 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, биты = '', связь = '' ) ! !! НЕ надежен в 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')
        
    • Выиграть 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
        
    • Выиграть 10 x64 :
      • file утилиты нет, есть другие 3 rd Инструменты для вечеринок, которые можно использовать, но я не буду настаивать на них


Победа определено:

  1. Проверка переменных env (например, % PROCESSOR_ARCHITECTURE% (или других)) через [Python 3]: os. environment
    • Победа 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.
7 голосов
/ 30 декабря 2016

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...