wake-up-neo.net

Python: MySQLdb und "Bibliothek nicht geladen: libmysqlclient.16.dylib"

Die Einrichtung...

Ich habe versucht, eine saubere Mac OS X 10.6-Installation einzurichten, um Python/Django zu entwickeln.

Nach der Installation von MySQL vom Installer auf mysql-5.5.8-osx10.6-x86_64.dmg Ich rannte

$ Sudo pip install MySQL-python

und es schien reibungslos zu gehen (Ausgabe unten)

Downloading/unpacking MySQL-python
  Downloading MySQL-python-1.2.3.tar.gz (70Kb): 70Kb downloaded
  Running setup.py Egg_info for package MySQL-python
    warning: no files found matching 'MANIFEST'
    warning: no files found matching 'ChangeLog'
    warning: no files found matching 'GPL'
Installing collected packages: MySQL-python
  Running setup.py install for MySQL-python
    building '_mysql' extension
    gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -DNDEBUG -g -fwrapv -Os -Wall -Wstrict-prototypes -DENABLE_DTRACE -pipe -Dversion_info=(1,2,3,'final',0) -D__version__=1.2.3 -I/usr/local/mysql/include -I/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c _mysql.c -o build/temp.macosx-10.6-universal-2.6/_mysql.o -Os -g -fno-common -fno-strict-aliasing -Arch x86_64
    In file included from _mysql.c:36:
    /usr/local/mysql/include/my_config.h:325:1: warning: "SIZEOF_SIZE_T" redefined
    In file included from /System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/Python.h:9,
                     from pymemcompat.h:10,
                     from _mysql.c:29:
    /System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/pymacconfig.h:33:1: warning: this is the location of the previous definition
    In file included from _mysql.c:36:
    /usr/local/mysql/include/my_config.h:419:1: warning: "HAVE_WCSCOLL" redefined
    In file included from /System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/Python.h:8,
                     from pymemcompat.h:10,
                     from _mysql.c:29:
    /System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/pyconfig.h:803:1: warning: this is the location of the previous definition
    gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup build/temp.macosx-10.6-universal-2.6/_mysql.o -L/usr/local/mysql/lib -lmysqlclient_r -lpthread -o build/lib.macosx-10.6-universal-2.6/_mysql.so -Arch x86_64
    warning: no files found matching 'MANIFEST'
    warning: no files found matching 'ChangeLog'
    warning: no files found matching 'GPL'
Successfully installed MySQL-python
Cleaning up...

danach habe ich versucht:

$ python -c "import MySQLdb"

und es hat mich beschissen mit:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Library/Python/2.6/site-packages/MySQLdb/__init__.py", line 19, in <module>
    import _mysql
ImportError: dlopen(/Library/Python/2.6/site-packages/_mysql.so, 2): Library not loaded: libmysqlclient.16.dylib
  Referenced from: /Library/Python/2.6/site-packages/_mysql.so
  Reason: image not found

Also weiter zu meiner Frage ...

Was habe ich falsch gemacht?/Was muss ich sonst noch tun?

Wenn Sie hier googeln (und suchen), werden viele Ergebnisse zurückgegeben, bei denen diese Fehlermeldung mit Ruby nicht zu viele mit Python tho) angezeigt wird.

59
rennat

_mysql.so Bezieht sich auf libmysqlclient.16.dylib. Das heißt, die gemeinsam genutzte Bibliothek, die als Brücke zwischen Python und der MySQL-Client-Bibliothek _mysql.so Dient, bezieht sich auf die dynamische Bibliothek für die MySQL-Client-Bibliothek, und diese Bibliothek kann nicht aus irgendeinem Grund geladen werden.

Fragen, die Sie beantworten müssen:

  • Gibt es irgendwo auf Ihrem System einen libmysqlclient.16.dylib? Wenn nicht, müssen Sie die MySQL-Client-Software installieren.
  • Wenn ja, befindet sich das Verzeichnis, in dem sich diese Bibliothek befindet, in Ihrer Einstellung DYLD_LIBRARY_PATH? Wenn nicht, füge es hinzu.
  • In diesem Fall müssen Sie sicherstellen, dass die Datei libmysqlclient.16.dylib Nicht beschädigt ist. Meine mit freundlicher Genehmigung von MacPorts in /opt/local/lib/mysql5/mysql/libmysqlclient.16.dylib Installierte Kopie hat die MD5-Signatur c79ee91af08057dfc269ee212915801a Und ist 1.462.376 Byte groß. Wie sieht deine Kopie aus?
55
Brian Clapper

Setze einfach das DYLD_LIBRARY_PATH nach dem Rennen pip install oder easy_install:

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/

Sollte die Arbeit erledigen, vorausgesetzt Ihre MySQL-Installation lebt unter /usr/local/mysql.

92
lukmdo

Nach easy_install erstelle ich einen Softlink, der das Problem löst

Sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
41
msbanik

Es kann auch auftreten, wenn Ihr MySQL-Client neuer ist als Ihr MySQL-Python-Paket. In meinem Fall hatte ich eine libmysqlclient_r.18.dylib auf meinem Computer, aber keine libmysqlclient_r.16.dylib. Laufen pip search mysql aufgedeckt

MySQL-Python - Python Schnittstelle zu MySQL INSTALLIERT: 1.2.3 AKTUELL: 1.2.3c1

und läuft pip install --upgrade MySQL-python mein problem behoben.

8

Auf meinem Setup (mysql 5.7.x von brew, pyenv) hatte ich eine neuere lib-Datei libmysqlclient.20.dylib. Was funktionierte, war zu pip uninstall MySQL-python und pip install MySQL-python.

7
Giannis

In der neuesten Version von MySQL 5.7.9 wird keine Unterstützung von MySQL-python und ich haben stattdessen die Bibliothek PyMySQL verwendet. Auch ich fügte hinzu in manage.py (in Django project)) diese Zeilen, um die API von MySQL-Python zu emulieren:

try:
    # load MySQLdb interface emulation
    import pymysql
    pymysql.install_as_MySQLdb()
except ImportError:
    pass
7

Für diejenigen wie mich, die sowohl MySQLdb als auch PyMySQL installiert haben oder benötigen (in meinem Fall mussten beide installiert sein, da ich PyMySQL für die Verbindung zu meinen lokalen MySQL-Instanzen und MySQLDb für Remote-/Live-Instanzen verwende):

Stellen Sie sicher, dass Sie das richtige URI-Schema verwenden. So greifen Sie auf die lokalen Instanzen zu:

LOCAL_DATABASE_URI = 'mysql+pymysql://username:[email protected]/dbname'

und fürs leben:

REMOTE_DATABASE_URI = 'mysql+mysqldb://username:[email protected]/dbname'

Diese Unterscheidung zu treffen, löste das Problem für mich

0
kip2