WxPython несовместим со снежным барсом? - PullRequest
18 голосов
/ 02 апреля 2010

Недавно я обновился до Snow Leopard и теперь не могу запускать программы, созданные с помощью wxPython. Я получаю следующие ошибки (из Eclipse + PyDev):

  import wx 
  File "/var/tmp/wxWidgets/wxWidgets-13~231/2.6/DSTROOT/System/Library/Frameworks
  /Python.framework/Versions/2.6/Extras/lib/
  python/wx-2.8-mac-unicode/wx/__init__.py", line 45, in <module>

  File "/var/tmp/wxWidgets/wxWidgets-13~231/2.6/DSTROOT
  /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib
  /python/wx-2.8-mac-unicode/wx/_core.py", line 4, in <module>
  ImportError:/System/Library/Frameworks
  /Python.framework/Versions/2.6/Extras/lib/python
  /wx-2.8-mac-unicode/wx/_core_.so: no appropriate 64-bit architecture 
  (see "man python" for running in 32-bit mode)

Я действительно не понимаю их, и был бы признателен, если бы вы могли помочь мне в этом, также, если вы знаете, что происходит, как я могу их исправить? Может быть, это как-то связано с тем, что Snow Leopard является 64-битным?

Спасибо !!

Ответы [ 6 ]

25 голосов
/ 02 апреля 2010

Проблема в том, что WxPython доступен только на Mac в 32-битном режиме; однако по умолчанию Python запускается в 64-битном режиме. Чтобы решить эту проблему, создайте следующий сценарий оболочки с именем python_32:

#! /bin/bash
export VERSIONER_PYTHON_PREFER_32_BIT=yes
/usr/bin/python "$@"

Сделайте скрипт исполняемым (chmod a+x python_32) и поместите скрипт в свой путь. Теперь просто вызовите python_32, чтобы получить интерактивную консоль Python, в которой вы можете использовать WxPython. Если вы хотите написать скрипт Python, который использует это, вы можете использовать шебанг: #! /usr/bin/env python_32.

Теперь объясним ... основная проблема заключается в том, что 32-разрядный и 64-разрядный код использует другой двоичный интерфейс приложения (ABI), и поэтому 32-разрядный код и 64-разрядный код не могут сосуществовать в одной библиотеке / исполняемый файл / процесс. Для поддержки 64-битного режима его необходимо скомпилировать в 64-битном режиме; аналогично, для поддержки 32-битного режима его необходимо скомпилировать в 32-битном режиме. Под OS X это возможно, используя универсальные двоичные файлы для поддержки обоих ... однако, это должно быть скомпилировано в обоих режимах (и затем объединено). WxWidgets, вероятно, использует Carbon, который доступен только в 32-битном режиме (Cocoa доступен как в 32-битном, так и в 64-битном режиме ... Apple не удосужилась сделать Carbon доступным в обоих режимах, так как это устарело), что объясняет, почему WxPython, в свою очередь, мог быть предоставлен только в 32-битном режиме. Это, в свою очередь, означает, что использование его в Python требует запуска Python в 32-разрядном режиме (Python - это универсальный двоичный файл с 32-разрядной и 64-разрядной версиями, доступными в одном двоичном файле, поэтому его можно запускается в любом режиме).

Альтернативный вариант
Я не рекомендую делать это, потому что я думаю, что вы должны оставить настройки по умолчанию такими, какие они есть, но, поскольку у вас может не быть достаточных знаний сценариев оболочки (вам нужно использовать «./python_32» или поместить его в папку, которая указана в ваша переменная окружения "$ PATH" и вызов ее как "python_32"), чтобы следовать первому варианту, вы можете просто выполнить следующую команду, которая сделает 32-битный режим по умолчанию:

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

Если вы решили вернуться в 64-битный режим, вы можете использовать следующую команду:

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

Обратите внимание, что обе команды должны выполняться в Терминале (не в Python).

Источник
Я должен отметить, что обе рекомендации основаны на man python в Mac OS X. Поэтому, если у вас есть какие-либо другие вопросы, вам обязательно следует прочитать страницу руководства, как вас об этом предупреждает сообщение об ошибке.

15 голосов
/ 27 октября 2010

Хотя я вижу, что на это уже есть ответ, ответ немного неправильный. Серия 2.9 ДОЛЖНА иметь 64-битную сборку Mac, хотя только для Python 2.7. Смотрите http://wxpython.org/download.php и ищите сборку Какао. Из того, что я собрал в списке рассылки wxPython и IRC-канале, вы захотите загрузить 64-битную сборку Python с python.org, а не использовать змею с Mac.

2 голосов
/ 11 октября 2010

Вы также можете попробовать команду arch при вызове python: arch -i386 /usr/bin/python2.6, если вы не можете запустить Python с правильными настройками среды. Переключатель '-i386' запускает универсальный двоичный файл в 32-разрядном режиме Intel. '-x86_64' заставляет его работать в 64-битном режиме Intel. -ppc и -ppc64 для архитектур PPC.

Если вы все еще получаете ошибки, это может указывать на проблему компиляции. На моей машине у меня есть стандартный Apple Python и версия от Macports. Команда arch работает с использованием двоичных файлов apple, и я могу успешно импортировать wx из командной строки, но я все еще получаю ошибки из двоичного файла Macports: Bad CPU type in executable Я предполагаю, что мне придется вернуться и перекомпилировать мой двоичный файл Macports python и уверен, что он производит универсальный двоичный файл или что-то в этом роде (вздох).

1 голос
/ 27 октября 2010

Это сработало для меня (из http://www.python -forum.de / viewtopic.php? F = 19 & t = 24322 & view = previous )

В .profile добавьте следующую строку псевдоним py32 = 'arch -i386 /Library/Frameworks/Python.framework/Versions/2.7/bin/pythonw2.7'

затем вызовите ваш скрипт с py32

1 голос
/ 02 апреля 2010

Другим решением является загрузка и установка Python 2.6 для OS X с python.org и установка wxPython для OS X с здесь с ним. Python.org 2.6 новее (на данный момент 2.6.5), чем поставляемый Apple Python (2.6.1) в Snow Leopard, и он только 32-разрядный.

0 голосов
/ 05 апреля 2010

Hm. Предоставленный сценарий не работает для меня - я изменил его следующим образом:

#! /bin/bash
echo "-----------------Python 2.6 - 32 Bit setup --------------------"
echo "Running" $1
export VERSIONER_PYTHON_PREFER_32_BIT yes
/usr/bin/python2.6 $1

Все еще не работал. Я получаю то же сообщение. Перечитайте справочную страницу, чтобы убедиться, что я не ошибаюсь, и я больше не буду двигаться вперед:

ImportError: /usr/local/lib/wxPython-unicode-2.8.10.1/lib/python2.6/site-packages/wx-2.8-mac-unicode/wx/_core_.so: no appropriate 64-bit architecture (see "man python" for running in 32-bit mode)

Не совсем уверен, почему это не работает, если только не требуется какая-то перестройка для ядра wx, обеспечивающая 32/64-битную совместимость. Любые предложения, кто-нибудь? Я хотел бы использовать готовую установку Python от Apple (будет проще для моей работы), и я хотел бы избежать более нелепых хаков

...