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

420

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

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

JKP
источник
1
Просто из интереса: зачем тебе это знать?
Леннарт Регебро
2
У меня проблемы со сборкой и загрузкой некоторых модулей в OS X 10.6. В частности, pysco, который жалуется, что я работаю в 64-битном режиме. Это под virtualenv, а поэтому есть некоторые дополнительные осложнения , мне нужно работать через ...
JKP
2
Я хотел бы знать, потому что, когда я использую что-то вроде PyInstaller для создания автономного двоичного дистрибутива (чтобы дать пользователям, которые могут не иметь (нужную версию) установленный Python, мой двоичный файл будет 32/64 бит в зависимости от на Python я запускаю PyInstaller с. В идеале я думаю, что я хотел бы автоматически назвать получившийся двоичный файл / файл архива с «32» или «64» в имени файла, а не вручную переименовывать файлы в зависимости от того, где я выполнить команду 'make' из.
Джонатан Хартли

Ответы:

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был введен в 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
Нед Дейли
источник
14
Использование sys.maxint не поможет обнаружить 64-битный Python при работе в Windows (см. Здесь ). Вместо этого используйте struct.calcsize ("P") для кроссплатформенного решения.
Люк Мур
Спасибо за проверку. Я существенно sys.maxsizeизменил ответ, чтобы показать теперь документированный тест для Python 2.6+ и structтест, используемый platformмодулем, который также работает для более старых версий Python 2.
Нед Дейли,
Это не работает в IronPython, sys.maxsize 2 ** 31 для обоих 32 бит и 64 бит IronPython
Мех
4
Иньон, это правда, но вопрос не в этом. И на тех процессорах, где можно запускать, скажем, 32-битные или 64-битные двоичные файлы, арка машины обычно не совсем подходит для программы на Python; важно то, как работает сам интерпретатор Python.
Нед Дейли
6
В Windows cmd вам необходимо поместить двойные кавычки снаружи и одинарные кавычки внутри, иначе это вызовет синтаксическую ошибку. Вероятно, это связано с тем, что windows считает, что пробелы между одинарными кавычками все еще являются разделителями аргументов. Может быть полезно скорректировать этот ответ с учетом этого факта.
Стивен Блюен
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-битный Python. Работает для моей конкретной настройки.

Dustin
источник
6
так это что? 64-битный питон или 32-битный питон?
phpJs
9
@phpJs 64 бит из-за[MSC v.1500 64 bit (AMD64)]
Эдуард Флоринеску
19
К сожалению, работает только для версий 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
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

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

import struct
print struct.calcsize("P") * 8
ChristopheD
источник
1
Имхо, лучше, чем версия ctypes - работает даже со старым Python.
yk4ever
7
Очень полезно, можно использовать в одну строку. $ python -c 'import struct; print struct.calcsize ("P") * 8 '
Сунь Ливен,
1
print (struct.calcsize ("P") * 8) лучше.
HelloWorld,
2
поэтому скопируйте и вставьте oneliner для Python3:python -c "import struct; print(struct.calcsize('P')*8)"
Нейнштейн
78

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

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

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

Мэтью Маршалл
источник
1
Это тоже работает, хотя у него есть возможный небольшой недостаток из-за ненужного импорта и загрузки модуля, если в противном случае вам не нужны ctypes: модуль sys, otoh, компилируется в интерпретатор.
Нед Дейли
пожалуйста, помогите мне понять: на моем 64b установка python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)'возвращается 8 . Или это должно быть 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)
фоби,
1
Просто позвонитеpython -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
vitiral
55

Откройте консоль 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
abe312
источник
Модуль patform не всегда надежен, см. docs 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')
rekabbnad
источник
Разве это решение не было названо OP нерабочим для него?
Энтони Хэтчкинс
Это может быть, но это именно то, что мне нужно; извините за +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 )
  • Моя главная цель - победа
  • У меня установлена ​​только 32-битная версия на Win (и я построил " урезанную" версию на Lnx )

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

  1. Проверьте [Python 3.Docs]: sys. maxsize value - сравните его с 0x100000000( 2 ** 32): больше для 64- битного , меньше для 32-битного :
    • OSX 9 x64 :
      • Python 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)
    • Ubuntu 16 x64 :
      • Python 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)
      • Python 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 х64 :
      • Python 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)
      • Python 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 ( формат ), чтобы определить размер объекта, созданный в формате (указатель). Другими словами, определяет размер указателя ( sizeof(void*)):
    • OSX 9 x64 :
      • Python 2.7.10 x64 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
    • Ubuntu 16 x64 :
      • Python 3.5.2 x64 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
      • Python 3.6.4 x86 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        32
    • Выиграй 10 х64 :
      • Python 3.5.4 x64 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
      • Python 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 :
      • Python 2.7.10 x64 :
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        64
    • Ubuntu 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 х64 :
      • 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.Docs]: платформа. архитектура ( исполняемый = sys.executable, bits = '', linkage = '' ) !!! НЕ надежен на OSX !!! из-за формата многоархивированного исполняемого файла (или .dylib ) (в некоторых случаях используется # 2. ):
    • OSX 9 x64 :
      • Python 2.7.10 x64 :
        >>> import platform
        >>> platform.architecture()
        ('64bit', '')
    • Ubuntu 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 х64 :
      • Python 3.5.4 x64 :
        >>> import platform
        >>> platform.architecture()
        ('64bit', 'WindowsPE')
      • Python 3.6.2 x86 :
        >>> import platform
        >>> platform.architecture()
        ('32bit', 'WindowsPE')


  1. Lame workaround ( gainarie ) - вызвать внешнюю команду ( [man7]: FILE (1) ) через [Python 3.Docs]: os. система ( команда ) . Ограничения № 4. применить (иногда это может даже не работать):
    • OSX 9 x64 :
      • Python 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
    • Ubuntu 16 x64 :
      • Python 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
      • Python 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 х64 :
      • файловой утилиты нет, есть другие сторонние инструменты, которые можно использовать, но я не буду на них настаивать


Выиграть конкретно:

  1. Проверьте env vars (например, % PROCESSOR_ARCHITECTURE% (или другие)) через [Python 3.Docs]: os. окружающая среда :
    • Выиграй 10 х64 :
      • 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.Docs]: sys. версия (также отображается в 1- й строке при запуске переводчика)
    • Проверьте № 1.
CristiFati
источник
7

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)
kimbaudi
источник
5

Сделайте python -VVв командной строке. Должен вернуть версию.

user12549815
источник
Это не показывает, как это сделать в Python.
ParkerD
Это не дает информации, необходимой для ответа на вопрос
Дмитрий Зайцев
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, 6 декабря 2015, 01:54:25) [MSC v.1900 64 бит (AMD64) ]

betontalpfa
источник
Не относится к OSX .
CristiFati
3

Основываясь на ответе abe32,

import sys
n_bits = 32 << bool(sys.maxsize >> 32)

n_bits будет иметь 32 или 64 бита.

Ришабх Бхатнагар
источник
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**32начиная с Py2.6.

Это надежный тест для фактического ( по умолчанию) размер указателя и совместим по крайней мере с Py2.3: struct.calcsize('P') == 8. Кроме того : ctypes.sizeof(ctypes.c_void_p) == 8.

Примечания: могут быть сборки с опцией gcc -mx32 или около того, которые являются приложениями 64-битной архитектуры, но по умолчанию используют 32-битные указатели (экономия памяти и скорости). 'sys.maxsize = ssize_t' может не строго соответствовать размеру указателя C (обычно это так 2**31 - 1или иначе). И были / есть системы, которые имеют разные размеры указателя для кода и данных, и необходимо уточнить, что именно является целью определения "32-битного или 64-битного режима?"

KXR
источник