Как определить, выполняется ли моя оболочка python в 32-битном или 64-битном режиме на OS X?
Мне нужен способ сказать, в каком режиме находится оболочка изнутри оболочки.
Я пробовал смотреть на платформа модуль, но он, кажется, только чтобы рассказать вам о "о битной архитектуре и формате связи, используемом для исполняемого файла": двоичный файл компилируется как 64bit, хотя (я работаю на OS X 10.6), поэтому он всегда сообщает 64bit, хотя я использую методы описано здесь для принудительного режима 32bit).
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
при запуске интерпретатора 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. Работает для моей конкретной установки.
в основном вариант ответа Мэтью Маршалла (со структурой из std.библиотека):
import struct print struct.calcsize("P") * 8
попробуйте использовать ctypes, чтобы получить размер указателя void:
import ctypes print ctypes.sizeof(ctypes.c_voidp)это будет 4 для 32 бит или 8 для 64 бит.
Откройте консоль python:
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
для непрограммного решения, посмотрите в мониторе активности. Он перечисляет архитектуру 64-битных процессов как " Intel (64-бит)".
в моей системе Centos Linux я сделал следующее:
1) запустил интерпретатор Python (я использую 2.6.6)
2) выполнить следующий код:import platform print(platform.architecture())и это дало мне
(64bit, 'ELF')
platform.architecture()написано:Примечание.: На Mac OS X (и, возможно, других платформах) исполняемые файлы могут быть универсальными файлами, содержащими несколько архитектур.
чтобы получить "64-битность" текущего интерпретатора, он более надежен чтобы запросить систему.атрибут значение maxsize:
import sys is_64bits = sys.maxsize > 2**32
struct.calcsize("P")возвращает размер байтов, необходимых для хранения одного указателя. В 32-разрядной системе он вернет 4 байта. В 64-разрядной системе он вернет 8 байт.таким образом, следующее вернется
32Если вы используете 32-битный python и64если вы используете 64-разрядный python:Python 2
import struct;print struct.calcsize("P") * 8Python 3
import struct;print(struct.calcsize("P") * 8)
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
группировка все...
потому что:
- вопрос задан OSX (у меня есть трещины старый VM С древней Python редакции)
- мой главный env-это Win
- в 32бит Python я только установлен на on Win (и я построил "krippled" на Lnx)
я собираюсь иллюстрации на всех 3 платформах. Я буду использовать Python3 и вместо python2. Док URL s однако, будет Python3 конкретные.
- Регистрация [Python 3]: sys. maxsize значение-сравните его с
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)
- использовать [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
- использовать [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
- [Python 3]: платформа.архитектура(исполняемый файл=sys.исполняемый файл, bits=", linkage=")!!! Не надежный на OSX !!! из - за нескольких исполняемых arch (или .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')
- Хромой обходной путь ( gainarie) - вызов внешней команды ([man7]: Файл(1)) через [Python 3]: os.система(команда). Ограничения #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 утилиты нет, есть другие 3 rd партийные инструменты, которые можно использовать, но я не собираюсь настаивать на них
Win конкретно:
- проверить переменные окружения (например,%PROCESSOR_ARCHITECTURE% (или другие)) через [Python 3]: os. environ:
- 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'
- [Python 3]: sys.версия (также отображается в 1 st строка при запуске переводчика)
- Регистрация #1.
import sys print(sys.version)3.5.1 (v3. 5. 1: 37a07cee5969, Dec 6 2015, 01:54:25) [MSC V. 1900 64 бит (AMD64)]
архитектура платформы не является надежным способом. Вместо этого:
$ 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)
Comments