Как заставить Python быть 32-битным в Snow Leopard и другие 32-битные / 64-битные вопросы

Когда я запускаю следующее из оболочки bash на моем Mac:

$ file /usr/bin/python

Я получаю следующие три строчки:

/usr/bin/python (for architecture x86_64):  Mach-O 64-bit executable x86_64
/usr/bin/python (for architecture i386):    Mach-O executable i386
/usr/bin/python (for architecture ppc7400): Mach-O executable ppc

это может указывать на то, что Python был скомпилирован для всех трех архитектур или что-то в этом роде? Я считаю, на основании некоторых ошибок, которые у меня были при настройке MySQL, что я использую 64-разрядную версию. Итак, два вопроса:

  1. Откуда я мог это знать?

  2. Как я могу изменить Python на 32-битный? Что-то менее радикальное, чем повторная компиляция с другими настройками компиляции?

  3. Почему arch из оболочки bash возвращает i386, что, казалось бы, указывает на то, что я не нахожусь в «64-битном режиме», когда я знаю на основе своего процессора, что использую 64-битный Mac?

Извините, это, вероятно, все вопросы для новичков, вся эта 32/64-битная штука меня до чертиков расстраивает, и я уверен, что есть некоторые команды / инструменты, которые упростят это.


person Bialecki    schedule 18.01.2010    source источник


Ответы (7)


  1. Вы можете много узнать о версии Python, которую используете, с помощью модуля platform (модуль sys также имеет несколько простых помощников)

  2. В Mac OS X вы можете запустить «толстый двоичный файл» с выбранной архитектурой, например,

    арка -i386 / usr / bin / python

Я не рекомендую изменять сам / usr / lib / python (с помощью команды lipo) - вы можете легко сделать свою систему непригодной для использования, изменив системные файлы. Возможно, установка отдельного Python от python.org (для приложений), оставив системный Python в покое, является для вас приемлемой стратегией - это определенно безопаснее, чем изменение системных файлов! -)

Что касается вашего третьего вопроса, хммм, это для меня загадка - и определенно вопрос для superuser.com (не только совершенно не связанный с Python, но и совершенно не связанный с программированием ;-).

person Alex Martelli    schedule 18.01.2010
comment
Хотя arch -i386 filename обычно поступает правильно, в версии 10.6 arch -i386 /usr/bin/python по-прежнему будет запускать Python в 64-битном режиме (если возможно). Либо используйте export VERSIONER_PYTHON_PREFER_32_BIT=yes (см. man 1 python от Apple), либо arch -i386 /usr/bin/python2.6. - person Ned Deily; 19.01.2010
comment
Обратите внимание, что переменная среды VERSIONER_PYTHON_PREFER_32_BIT является функцией поставляемого Apple Python 2.6 в OS X 10.6 (/usr/bin/python). Это не влияет на другие питоны, например, установленные установщиками python.org. - person Ned Deily; 31.08.2010
comment
Привет, ребята, я собрал свой дистрибутив Python из исходников, используя проект диспетчера пакетов Homebrew (их строки заставляют смеяться, MacPorts заставляет вас пить? Попробуйте Homebrew!). VERSIONER_PYTHON_PREFER_32_BIT мне кажется для поставляемого Apply python, есть ли способ сыграть тот же трюк с пользовательским дистрибутивом python? Я действительно не хочу использовать псевдоним arch -i386 python для python. - person Daniel Farrell; 06.02.2011
comment
@boyfarrell У меня точно такой же вопрос. Вы когда-нибудь находили уловку? Мне показалось, что даже псевдонимы не работают, я не мог заставить свой тестовый сервер Django работать с 32-битным питоном - person Neil; 11.12.2015

http://www.jaharmi.com/2009/08/29/python_32_bit_execution_on_snow_leopard

$ defaults write com.apple.versioner.python Prefer-32-Bit -bool yes

person danielrsmith    schedule 18.01.2010
comment
Это или используйте переменную среды VERSIONER_PYTHON_PREFER_32_BIT, как описано в man 1 python. - person Ned Deily; 19.01.2010
comment
Идеально. Работает на Mac OS X Mavericks 10.9. - person andilabs; 26.10.2013
comment
Спасибо! Я весь день искал решение. - person Cilan; 21.07.2014

Исправление для использования с virtualenv на Snow Leopard

Ответ danielrsmith работает для меня, когда я не использую virtualenv, но virtualenv создает копию исполняемого файла python, из-за чего он не работает:

$ which python
/Users/cogg/.virtualenvs/tweakeats/bin/python

$ python
[...]
>>> import sys
>>> sys.maxint
9223372036854775807

поскольку это копия python, я использовал липо для удаления 64-битной архитектуры. Это позволяет мне использовать 32-битный Python 2.6 с virtualenv:

$ lipo -info /Users/cogg/.virtualenvs/tweakeats/bin/python
Architectures in the fat file: /Users/cogg/.virtualenvs/tweakeats/bin/python are: x86_64 i386 ppc7400
$ mv /Users/cogg/.virtualenvs/tweakeats/bin/python /Users/cogg/.virtualenvs/tweakeats/bin/python.old
$ lipo -remove x86_64 /Users/cogg/.virtualenvs/tweakeats/bin/python.old -output /Users/cogg/.virtualenvs/tweakeats/bin/python
$ python
[...]
>>> import sys
>>> sys.maxint
2147483647
person cogg    schedule 17.06.2010
comment
СПАСИБО. Я был почти в слезах, пытаясь найти решение после проигрыша psycopg2. - person Jonathan Vanasco; 22.11.2012
comment
почему копия Python VE не учитывает переменную среды? - person rbp; 15.08.2013

Ответ был принят. Но я думаю, что до сих пор нет ответа на 3-й вопрос. Я обнаружил, что это интересный вопрос, и провел небольшое исследование по нему. Вот ответ, который я нашел на другом форуме SO -

SnowLeopard запускает 32-битное системное программное обеспечение и приложения на 32-битных машинах Intel, а также 64-битное системное программное обеспечение и 32-битные и 64-битные приложения на 64-битных машинах Intel. В настольной версии Snow Leopard загружается 32-разрядное ядро ​​из соображений совместимости с kext и драйверами, но все пользовательское пространство работает на 64-разрядной версии. Сервер Mac OS X загружается с 64-битным ядром. Core 2 Duo - это 64-битная машина. Попробуйте $ sysctl hw.cpu64bit_capable или sysctl hw.optional.x86_64, чтобы убедиться, что у вас 64-битный процессор. Arch всегда будет отображать i386 на оборудовании Intel как в Leopard, так и в Snow Leopard. - cdespinosa, 22 сен.

Исходная ссылка - Mac OSX 10.6 компилятор: удивительный опыт работы с 32-разрядной и 64-разрядной версии

person Sumod    schedule 01.07.2011

третий вопрос касается 32/64-битного ядра

тот факт, что у вас 64-битная ОС и 64-битный процессор, не означает, что вы загружаете 64-битное ядро ​​в Mac OSX.

Если у вас есть Mac со снежным барсом 10.6 на заводе, то по умолчанию он поставляется в 32-битном режиме.

вам нужно будет отредактировать настройки системы для загрузки в 64-битном режиме

(не уверен в изменениях в 10.7 или 10.8, так как последнее, что я использую, это Snow Leo, но я считаю, что они могут загружать 64-битное ядро ​​по умолчанию)

10.6 - из терминала выполните команду:

 :*sudo nvram boot-args="arch=x86_64"

OR

10.6 - из терминала выполните команду:

sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.Boot 'Kernel Flags' 'arch=x86_64'
person hackg    schedule 07.11.2012

Я пробовал много разных способов выполнить тестовый скрипт Skype4Py, используя,

arch -i386

Что сработало, так это поиск пути segfault для заявленной 64-битной версии python и его размещение в моем файле заголовка: #! / System / Library / Frameworks / Python.framework / Versions / 2.7 / Resources / Python.app / Содержание / MacOS / Python

После того, как я поместил эту строку вверху и добавил разрешения на выполнение в свой файл, я мог использовать, arch -i386 skype.py

И это будет работать без проблем.

person elec3647    schedule 08.08.2013

После огромного количества проб и ошибок я попробовал некоторые из приведенных выше предложений, я наткнулся на следующую символическую ссылку:

/usr/local/bin/python2-32

указывает на:

/Library/Frameworks/Python.framework/Versions/2.7/bin/python2-32

И я заметил, что когда я запускаю этот Python, он запускается в 32-битном режиме (в отличие от /Library/Frameworks/Python.framework/Versions/2.7/bin/python2). Это можно увидеть в Activity Monitor.

Примечание: как другие указывали в другом месте, platform.architecture() не всегда является хорошим индикатором. Для этого 32-битного процесса отображается "64-битный".

person Pyderman    schedule 15.01.2016