Як визначити, чи виконується моя оболонка python в режимі 32 біт або 64 біт на OS X?


420

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

Я намагався подивитися модуль платформи, але, здається, лише розповів вам про "бітну архітектуру та формат зв'язку, що використовується для виконуваного файлу": двійковий файл компілюється як 64-бітний, хоча я працюю на OS X 10.6) Схоже, завжди повідомляється про 64-бітну, хоча я використовую описані тут методи для примусового 32- бітного режиму)


1
Просто з інтересу: навіщо вам це знати?
Леннарт Регебро

2
У мене виникають проблеми зі створенням та завантаженням деяких модулів на OS X 10.6. Зокрема Pysco, який скаржиться, що я працюю в 64-бітовому режимі. Це також під virtualenv, тому є деякі додаткові ускладнення, які мені потрібно пережити ...
jkp

2
Мені хотілося б знати, тому що коли я використовую щось на зразок PyInstaller для створення автономного бінарного розповсюджуваного файлу (щоб дати користувачам, які, можливо, не встановили (правильну версію) Python, двійковий файл, який я виробляю, буде 32/64 біт залежно на Python, з яким я запускаю PyInstaller. В ідеалі я думаю, що я хотів би автоматично назвати отриманий бінарний / архівний файл з назвою "32" або "64", а не перейменовувати файли вручну залежно від того, де я виконайте команду 'make' від.
Джонатан Хартлі

Відповіді:


412

Один із способів - це розглядати 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.
Ned Deily

Це не працює в IronPython, sys.maxsize становить 2 ** 31 для 32-бітного та 64-розрядного IronPython
Мех

4
Інон, це правда, але це не те, про що задавали питання. І на тих процесорах, де можна запустити, скажімо, 32-бітні або 64-бітні бінарні файли, арка машини, як правило, не все, що стосується програми Python; Що важливо, в чому арка працює інтерпретатор Python.
Нед Дейлі

6
У Windows cmd вам потрібно поставити подвійні лапки зовні, а одинарні лапки зсередини, інакше це призведе до синтаксичної помилки. Це, мабуть, тому, що Windows вважає, що проміжки між одноцитатами все ще є розмежувачами аргументів. Може бути корисним скоригувати цю відповідь, щоб відповідати цьому факту.
Стівен Блаен

254

Під час запуску інтерпретатора 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. Працює для моєї конкретної установки.


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
1414

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

190

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

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

1
Імхо, краща версія версії ctypes - працює навіть зі старшим Python.
yk4ever

7
Дуже корисно, може використовуватися в одному рядку. $ імпорту структура $ python -c '; друк struct.calcsize ("P") * 8 '
Sun Liwen

1
друк (struct.calcsize ("P") * 8) краще.
HelloWorld

2
тому скопіюйте вставку oneliner для Python3:python -c "import struct; print(struct.calcsize('P')*8)"
Neinstein

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')"
витірал

54

Відкрити консоль пітона:

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

Модуль набору форм не завжди є надійним. див. 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')

Хіба це рішення не було визначене ОП для нього неробочим?
Ентоні Хеткінс

Це може бути, але це ТОЧНО те, що мені було потрібно; вибачте за +1 "неправильну відповідь", але мені це було дуже потрібно.
UnsettlingTrend

Це рішення ідеально підходить для Solaris 11.
Стівен Вулф

11

platform.architecture() примітки кажуть:

Примітка. На Mac OS X (і, можливо, інших платформах) виконувані файли можуть бути універсальними файлами, що містять декілька архітектур.

Щоб потрапити на "64-розрядність" поточного інтерпретатора, надійніше запитати атрибут sys.maxsize:

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

11

Групування всього ...

Враховуючи, що:

  • Питання задається для OSX (у мене є стара (і зламана) VM з давньою версією Python )
  • Моє головне оточення - Win
  • У мене на Win встановлена тільки 32-бітна версія (і я створив " каліку " на Lnx )

Я збираюся зробити приклад на всіх 3 платформах, використовуючи Python 3 та Python 2 .

  1. Перевірте [Python 3.Docs]: sys. Максимальне значення - порівняйте його з 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 x64 :
      • 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. обчислення ( формат ) для визначення розміру об'єкта, що утворюється у форматі (покажчик). Іншими словами, визначає розмір вказівника (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 x64 :
      • 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 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.Docs]: платформа. архітектура ( виконувана = sys.executable, bits = '', linkkage = '' ) !!! НЕ надійний на 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 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.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 x64 :
      • утиліта файлів відсутня, є й інші інструменти 3- ї партії, які можна використовувати, але я не збираюся наполягати на них


Виграйте конкретно:

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

7

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

Таким чином, наступне повернеться, 32якщо ви працюєте з 32-розрядним пітоном і 64якщо ви працюєте з 64-розрядним пітоном:

Пітон 2

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

Пітон 3

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


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) ]


Не застосовується до 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.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.