web-dev-qa-db-fra.com

Python MySQL mauvaise erreur d'architecture

J'y travaille depuis un certain temps et j'ai lu de nombreux sites sur le sujet. soupçonne que j'ai junk mentir à propos de ce problème. Mais où?

C'est l'erreur quand j'importe MySQLdb en 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

J'essaie de 64 bits alors vérifié ici:

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

J'ai défini ma version par défaut de python sur 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

J'ai essayé de supprimer le répertoire de construction et le fichier setup.py clean de Python . Renommé Python/2.5/site-packages afin qu'il ne puisse pas essayer de le récupérer.

METTRE À JOUR

Tout supprimé et suivi les instructions ici: Django + MySQL sous Mac OS 10.6.2 Snow Leopard installation à l'aide de macports. 

Mais fondamentalement, toujours la même erreur

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
>>> 
26
PhoebeB

Quand l'interprète dit est:

Vous avez installé MySQL_python-1.2.3c1 dans /Library/Python/2.6/site-packages Mais vous ajoutez à sys.path une autre version dans /users/phoebebr/Downloads.. Lorsque j'essaie pour importer MySQLdb à partir du deuxième répertoire, j'ai trouvé que _mysql.so provient d'une autre architecture.

SO, il semble que vous ayez fini avec la mauvaise version de MySQLdb. Supprimer /Users/phoebebr/.python-eggs/MySQL_python-1.2.3c1-py2.6-macosx-10.6-universal.Egg-tmp et /Users/phoebebr/Downloads/MySQL-python-1.2.3c1 . Testez à nouveau pour voir si la version Dans/library fonctionne. Sinon, téléchargez le binaire pour MacOS. En dernière instance, téléchargez La source de MySQL-python et compilez-la.

2
jdinunzio

J'ai un MacBook Air frais et j'ai réussi à faire fonctionner MySQLdb en procédant comme suit: (Snow Leopard 10.6.6, Python préinstallé)

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

Téléchargez le fichier dmg MySQL 32 bits à partir de pages mysql, installez-le.

Ajoutez les lignes suivantes à votre ~/.profile (ou ~/.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

Après la sauvegarde, tapez ce qui suit dans le terminal: Source ~/.profile

Téléchargez le fichier MySQL-python-1.2.3.tar.gz unzip, untar, cd dans ce répertoire

python2.5 setup.py build
Sudo python2.5 setup.py install

quittez ce répertoire (ou vous recevrez un avertissement)

python2.5
import MySQLdb

ou

python
import MySQLdb

fonctionne comme il se doit !!

29
Pekka Toiminen

J'ai juste eu du mal avec la même chose, malgré les nombreuses réponses, alors je vais risquer d'en ajouter une autre:

  • Exécutez python -c 'import platform; print platform.platform()'. Est-ce que ça finit en "64 bit"?
  • Faites ls -l /usr/local/mysql. C'est un lien symbolique: se termine-t-il par "x86_64"?

Si python dit "64 bits", vous voulez alors mysql pour "x86_64" (recherchez-le à http://dev.mysql.com/downloads/mysql/ ). Si python dit "32 bits", alors vous voulez probablement le mysql "x86". Si vous avez une correspondance, mais que cela ne fonctionne toujours pas, lisez les autres réponses (à propos de VERSIONER_PYTHON_PREFER_32_BIT, etc.).

Pour moi, l'incompatibilité a causé l'erreur "mach-o, but wrong architecture". L'erreur suivante était "Library not loaded: libmysqlclient.18.dylib... Reason: image not found".

Pour résoudre ce problème, je vous recommande d'ajouter un lien symbolique (plutôt que de définir DYLD_LIBRARY_PATH, comme expliqué dans d'autres réponses):

Sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/
13
DS.

Cela est dû au fait que votre Python est 32bits, mais que la bibliothèque MySQL installée est 64bits. Pour résoudre le problème, vous pouvez l'installer manuellement à l'aide des commandes suivantes:

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

Avec ARCHFLAGS = "- Arch i386", il devrait être compilé sous l’architecture i386.

4
Fang-Pen Lin

Ceci est un coup dans le noir - pas familier avec MACOSX - mais j'ai vu un problème similaire sous Linux et ne pouvais le résoudre qu'en:

  1. Désinstallation de tous les composants MySQLdb via le gestionnaire de paquets
  2. Effectuer une recherche de bas niveau pour localiser tous les répertoires et fichiers restants relatifs à MySQLdb - si vous avez installé/construit manuellement MySQLdb, vous y trouverez probablement des références quelque part, mais le plus probablement dans le répertoire site-packages - j’ai fait et les supprimer simplement est la approche recommandée basée sur la recherche que j'ai faite

Ensuite, j'ai essayé d'importer MySQLdb et je me suis assuré que le paquet n'existait pas - au moins je savais que MySQLdb était supprimé à 100%

Ensuite, j'effectue une nouvelle installation via le gestionnaire de paquets si cette option existe car elle sera compatible à 100% avec votre plate-forme et vos bibliothèques. Compiler, etc. est une bonne chose, mais vous devez faire beaucoup de travail sur les jambes pour vous assurer que vous avez les bonnes bibliothèques clientes MySQL, etc. vers lesquelles vous connecter (en fonction de ma douloureuse expérience).

Bonne chance.

Dans le pire des cas ... vous pouvez utiliser l'option alternative python pure de PyMySQL ( http://pypi.python.org/pypi/PyMySQL/0.2 ) mais je dois avouer que la plupart des gens recommandent MySQLdb.

1
belvoir

Il semble que ce problème soit lié à la version de mysql que vous avez sur la boîte. Lors de la compilation du composant mysql python, il utilise mysql_config, qui réside généralement dans/usr/local/mysql/bin pour déterminer les indicateurs à transmettre à CC lors de la compilation du composant mysql. Si vous avez une version 32 bits de mysql en cours d'exécution, vous obtiendrez une version 32 de ce composant, même si vous avez la version 64 bits de python. A titre d'exemple, j'ai eu la version suivante de mysql ...

/usr/local/mysql-5.5.16-osx10.6-x86 et j'aurais dû exécuter ... /usr/local/mysql-5.5.16-osx10.6-x86_64 

Passer à la version 64 bits de mysql sur ma machine, puis exécuter ... Sudo pip installer mysql-python 

résolu le problème pour moi. Vous pouvez exécuter la commande suivante pour vérifier comment il va construire le composant mysql ...

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

Vous devriez voir quelque chose comme ça ...

-I/usr/local/mysql/include -Os -g -fno-common -fno-strict-aliasing -Arch x86_64

1
Peter

J'ai une autre solution possible à ajouter.

J'ai résolu le problème en ajoutant la ligne suivante à .profile (.bash_profile est correct s'il s'agit d'une machine de développement):

export VERSIONER_PYTHON_PREFER_64_BIT=yes
export VERSIONER_PYTHON_PREFER_32_BIT=no

(2ème ligne peut-être pas nécessaire, cependant. Mais après des heures de bidouillage, d'essayer, de recompiler, je ne pouvais plus être dérangé d'essayer cela).

1
Markus

J'ai eu le même problème avec MySQLdb sous Mac OS X et Ubuntu. Je suis donc passé au connecteur officiel MysQL Python: (disponible sur PyPI):

Sudo pip install mysql-connector-python

ou par téléchargement depuis: http://dev.mysql.com/downloads/connector/python/

Documentation: http://dev.mysql.com/doc/refman/5.5/en/connector-python.html

Il est facile à utiliser et également compatible avec PEP 249 (Python DB API version 2.0).

0
Yassine El Badaoui

J'ai rencontré le même problème. 

  • Ma situation: Mac OSX 10.6, python est en 64 bits, mysql en 32 bits et _mysql.so en 32 bits.

  • Solution: désinstallez mysql (http://steveno.wordpress.com/2009/03/26/uninstall-mysql-on-mac-os-x/) et installez mysql 64 bits. Assurez-vous ensuite que mysql_config pointe sur celui que vous venez d'installer. 

IMPORTANT:
supprime tous les _mysql.so du répertoire MySQL-python-1.2.3 (c’est ce que vous téléchargez) ou supprimez simplement le répertoire entier et générez-le à nouveau à partir du fichier tar. Ensuite, compilez et réinstallez. Alors _mysql.so sera en 64 bits. Maintenant, vous pouvez l'importer. Si vous voyez dyld: Library not loaded, exportez DYLD_LIBRARY_PATH=/usr/local/mysql/lib

0
talent

J'ai eu le même problème avec mon Mac ElCaptain et résolu le problème en suivant cet autre post . Utilisez simplement infusion et votre problème est résolu.

0
Arthur Accioly

Note complémentaire pour clarifier le problème:

Le message d'erreur est:

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

L'architecture mach-o, mais incorrecte error signifie que python et _mysql.so ont une architecture différente (binaire 32 bits/64 bits). Nous pouvons le vérifier par:

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

Et si elles ne correspondent pas, nous devrions les faire correspondre. Pour moi, mon _mysql.so est 32 bits (il m'est arrivé d'installer le mysql 32 bits) et mon python2.7 s'exécute en 64 bits par défaut. Je force Python s'exécute en 32 bits par:

export VERSIONER_PYTHON_PREFER_32_BIT=yes

Et problème résolu.

python 2.6+ peut être exécuté en mode 64 ou 32 bits, vérifiez Comment puis-je déterminer si mon shell python est exécuté en mode 32 bits ou 64 bits sous OS X?

0
hhwithgroups

Ce problème a été résolu pour moi en sélectionnant la version correcte de python. Si vous avez installé avec macports:

Sudo port select python python26
0
hughes