Ошибка неправильной архитектуры Python MySQL - PullRequest
26 голосов
/ 17 июня 2010

Я был в этом в течение некоторого времени и прочитал много сайтов на эту тему. подозреваю, что у меня вранье из-за этой проблемы. Но где?

Это ошибка при импорте MySQLdb в python:

>>> import MySQLdb
    /Library/Python/2.6/site-packages/MySQL_python-1.2.3c1-py2.6-macosx-10.6-universal.egg/_mysql.py:3: UserWarning: Module _mysql was already imported from /Library/Python/2.6/site-packages/MySQL_python-1.2.3c1-py2.6-macosx-10.6-universal.egg/_mysql.pyc, but /Users/phoebebr/Downloads/MySQL-python-1.2.3c1 is being added to sys.path
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "MySQLdb/__init__.py", line 19, in <module>
        import _mysql
      File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 7, in <module>
      File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 6, in __bootstrap__
    ImportError: dlopen(/Users/phoebebr/.python-eggs/MySQL_python-1.2.3c1-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so, 2): no suitable image found.  Did find:
        /Users/phoebebr/.python-eggs/MySQL_python-1.2.3c1-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so: mach-o, but wrong architecture

Я пытаюсь на 64 бит, так что проверил здесь:

file $(which python)
/usr/bin/python: Mach-O universal binary with 3 architectures
/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
file $(which mysql)
/usr/local/mysql/bin/mysql: Mach-O 64-bit executable x86_64

Установили мою версию Python по умолчанию на 2,6

python
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin

Попробовал удалить каталог сборки и python setup.py clean Переименован в Python / 2.5 / site-packages, чтобы он не мог его подцепить.

UPDATE

Удалил все и следовал инструкциям здесь: Django + MySQL в Mac OS 10.6.2 Snow Leopard установка с использованием macports.

Но в принципе все равно получаю ту же ошибку

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/MySQLdb/__init__.py", line 19, in <module>
    import _mysql
ImportError: dlopen(/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/_mysql.so, 2): no suitable image found.  Did find:
    /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/_mysql.so: mach-o, but wrong architecture
>>> 

Ответы [ 12 ]

29 голосов
/ 22 февраля 2011

У меня есть свежий MacBook Air, и мне удалось заставить MySQLdb работать, выполнив следующие действия: (Snow Leopard 10.6.6, предустановленный Python)

uname -a
Darwin Braindamage.local 10.6.0 Darwin Kernel Version 10.6.0: Wed Nov 10 18:13:17 PST 2010; root:xnu-1504.9.26~3/RELEASE_I386 i386

Загрузите 32-битный dmg-файл MySQL со страниц mysql, установите его.

Добавьте следующие строки в ваш ~ / .profile (или ~ / .bash_profile):

PATH="/usr/local/mysql/bin:${PATH}"
export PATH
export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/
export VERSIONER_PYTHON_PREFER_64_BIT=no
export VERSIONER_PYTHON_PREFER_32_BIT=yes

После сохранения введите в терминале следующее: источник ~ / .profile

Загрузите MySQL-python-1.2.3.tar.gz разархивируйте, untar, cd в этот каталог

python2.5 setup.py build
sudo python2.5 setup.py install

выйти из этого каталога (или вы получите предупреждение)

python2.5
import MySQLdb

или

python
import MySQLdb

работает так, как должно !!

13 голосов
/ 26 сентября 2011

Я боролся с тем же, несмотря на множество ответов, поэтому рискну добавить еще одно:

  • Выполнить python -c 'import platform; print platform.platform()'.Это заканчивается на «64 бит»?
  • Do ls -l /usr/local/mysql.Это символическая ссылка: заканчивается ли она на «x86_64»?

Если python говорит «64-битный», то вы хотите mysql для «x86_64» (ищите это в http://dev.mysql.com/downloads/mysql/). Если pythonговорит "32 бит", тогда вы, вероятно, хотите "x86" mysql. Если у вас есть совпадение, но оно все еще не работает, то прочитайте другие ответы (о VERSIONER_PYTHON_PREFER_32_BIT и т. д.)

Для меня,несоответствие вызвало ошибку "mach-o, but wrong architecture". Следующая ошибка была "Library not loaded: libmysqlclient.18.dylib... Reason: image not found".

. Чтобы решить эту проблему, я рекомендую добавить символическую ссылку (вместо установки DYLD_LIBRARY_PATH, как объяснено в других ответах):

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/
4 голосов
/ 13 марта 2011

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

wget http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz
tar xvf MySQL-python-1.2.3.tar.gz
cd MySQL-python-1.2.3
ARCHFLAGS="-arch i386" python setup.py install

При ARCHFLAGS = "- arch i386" он должен быть скомпилирован как архитектура i386.

2 голосов
/ 17 июня 2010

Когда переводчик говорит:

Вы установили MySQL_python-1.2.3c1 в /Library/Python/2.6/site-packages но вы добавляете в sys.path другую версию в / users / phoebebr / Downloads. Когда я пытаюсь импортировать MySQLdb из второго каталога, я обнаружил, что _mysql.so из другой архитектуры.

ТАК, кажется, вы закончили с неправильной версией MySQLdb. удалять /Users/phoebebr/.python-eggs/MySQL_python-1.2.3c1-py2.6-macosx-10.6-universal.egg-tmp и /Users/phoebebr/Downloads/MySQL-python-1.2.3c1. Проверьте снова, чтобы увидеть, если версия в / библиотека работает. Если нет, загрузите бинарный файл для MacOS. В последнем случае загрузите исходник MySQL-python и скомпилируйте его.

1 голос
/ 14 октября 2011

Похоже, что эта проблема связана с версией mysql, установленной на коробке.При компиляции компонента python mysql он использует mysql_config, который обычно находится в / usr / local / mysql / bin, чтобы определить, какие флаги передавать в CC при компиляции компонента mysql.Если у вас запущена 32-битная версия mysql, вы получите 32-битную версию этого компонента, даже если у вас есть 64-битная версия python.В качестве примера у меня была следующая версия mysql ...

/ usr / local / mysql-5.5.16-osx10.6-x86, и я должен был работать ... / usr / local / mysql-5.5.16-osx10.6-x86_64

Переход на 64-битную версию mysql на моем компьютере и запуск ... sudo pip install mysql-python

исправил проблему для меня,Вы можете выполнить следующую команду, чтобы проверить, как собирается компонент mysql ...

/ usr / local / mysql / bin / mysql_config --cflags

Вы должны увидеть что-то вродеэто ...

-I / usr / local / mysql / include -Os -g -fno-common -fno-строго-псевдонимы -arch x86_64

1 голос
/ 30 сентября 2010

Я получил еще одно возможное решение для добавления.

Я решил проблему, добавив следующую строку в .profile (.bash_profile нормально, если это машина для разработки):

export VERSIONER_PYTHON_PREFER_64_BIT=yes
export VERSIONER_PYTHON_PREFER_32_BIT=no

(2-я строка может и не понадобиться. Но после нескольких часов возни, попыток, перекомпиляции, я просто не мог больше беспокоиться об этом).

1 голос
/ 02 июля 2010

Это выстрел в темноте - не знакомый с MACOSX - но я видел подобную проблему под Linux и мог решить ее только:

  1. Удаление всех компонентов MySQLdb через менеджер пакетов
  2. Выполнение низкоуровневого поиска, чтобы найти все оставшиеся каталоги и файлы, относящиеся к MySQLdb - если вы вручную установили / собрали MySQLdb, вы, вероятно, где-нибудь найдете ссылки на него, но, скорее всего, в каталоге site-packages - я сделал и просто удалил они - рекомендуемый подход, основанный на исследовании, которое я сделал

Затем я попытался импортировать MySQLdb и удостоверился, что получил простую ошибку, что пакет не существует - по крайней мере, я знал, что MySQLdb был удален на 100%

Затем я выполняю чистую установку через менеджер пакетов, если такая опция существует, поскольку она будет на 100% совместима с вашей платформой и библиотеками. Компиляция и т. Д. - это здорово, но вам нужно проделать большую работу, чтобы убедиться, что у вас есть нужные клиентские библиотеки MySQL и т. Д., На которые можно ссылаться (основываясь на моем болезненном опыте)

Удачи.

В худшем случае ... вы можете использовать альтернативную опцию PyMySQL pure python (http://pypi.python.org/pypi/PyMySQL/0.2), но я должен признаться, что большинство людей рекомендуют MySQLdb

0 голосов
/ 30 апреля 2016

У меня была такая же проблема с моим ElCaptain Mac, и я решил эту проблему, следуя этой другой публикации . Просто используйте brew, и ваша проблема решена.

0 голосов
/ 22 февраля 2016

Дополнительное примечание, чтобы прояснить проблему:

Сообщение об ошибке:

ImportError: dlopen(/Users/phoebebr/.python-eggs/MySQL_python-1.2.3c1-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so, 2): no suitable image found.  Did find:
    /Users/phoebebr/.python-eggs/MySQL_python-1.2.3c1-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so: mach-o, but wrong architecture

Ошибка mach-o, но неправильная архитектура означает, что python и _mysql.so имеют различную архитектуру (32-разрядный / 64-разрядный двоичный код) , Мы можем проверить это:

file $(which python)
file /Users/phoebebr/.python-eggs/MySQL_python-1.2.3c1-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so

И если они не совпадают, мы должны заставить их совпадать. Для меня _mysql.so 32-битный (я установил 32-битный mysql), а мой python2.7 по умолчанию работает в 64-битной версии. Я заставляю Python работать в 32-битной версии:

export VERSIONER_PYTHON_PREFER_32_BIT=yes

И проблема решена.

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

0 голосов
/ 03 января 2013

У меня была такая же проблема с MySQLdb в Mac OS X и Ubuntu, поэтому я переключился на официальный MysQL Python Connector: (доступен на PyPI):

sudo pip install mysql-connector-python

или путем загрузки с: http://dev.mysql.com/downloads/connector/python/

Документация: http://dev.mysql.com/doc/refman/5.5/en/connector-python.html

Он прост в использовании и совместим с PEP 249 (Python DB API версии 2.0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...