Python: MySQLdb и «Библиотека не загружена: libmysqlclient.16.dylib» - PullRequest
59 голосов
/ 30 декабря 2010

Настройка ...

Попытка настроить чистую установку Mac OS X 10.6 для разработки python / django, и я не помню, чтобы столкнулся с этим на 10.5.

После установки MySQL из установщика на mysql-5.5.8-osx10.6-x86_64.dmg я запустил

$ sudo pip install MySQL-python

и все прошло гладко (вывод ниже)

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...

после этого я попробовал:

$ python -c "import MySQLdb"

и мне это показалось:

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

Итак, на мой вопрос ...

Что я сделал не так? / Что еще мне нужно сделать?

Google (и поиск здесь) для этого возвращает много результатов, получая это сообщение об ошибке с Ruby, не слишком много с Python tho.

Ответы [ 7 ]

92 голосов
/ 03 января 2011

Просто установите DYLD_LIBRARY_PATH после запуска pip install или easy_install:

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

Должен выполнять работу, предполагая, что ваша установка MySQL находится под /usr/local/mysql.

55 голосов
/ 30 декабря 2010

_mysql.so относится к libmysqlclient.16.dylib. То есть разделяемая библиотека, которая служит мостом между Python и клиентской библиотекой MySQL, _mysql.so, ссылается на динамическую библиотеку для клиентской библиотеки MySQL, и эта библиотека по какой-то причине не может быть загружена.

Вопросы, на которые вам нужно ответить:

  • Есть ли в вашей системе libmysqlclient.16.dylib? Если нет, вам нужно установить клиентское программное обеспечение MySQL.
  • Если да, каталог, содержащий эту библиотеку, в настройках DYLD_LIBRARY_PATH? Если не, попробуйте добавить его.
  • Если это так, вам нужно убедиться, что файл libmysqlclient.16.dylib не поврежден. мой копия, установленная в /opt/local/lib/mysql5/mysql/libmysqlclient.16.dylib, любезно предоставлена MacPorts имеет подпись MD5 c79ee91af08057dfc269ee212915801a и имеет размер 1 462 376 байт. Как выглядит ваша копия?
41 голосов
/ 25 декабря 2012

После easy_install я создаю программную ссылку, которая решает проблему

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
8 голосов
/ 30 июня 2011

Может также возникнуть, если ваш клиент MySQL новее, чем ваш пакет MySQL-python.В моем случае у меня был libmysqlclient_r.18.dylib на моей машине, но не libmysqlclient_r.16.dylib.Запуск pip search mysql открыл

MySQL-python - интерфейс Python для MySQL УСТАНОВЛЕН: 1.2.3 ПОСЛЕДНЯЯ: 1.2.3c1

и запуск pip install --upgrade MySQL-python устранили мою проблему

7 голосов
/ 13 июня 2016

На моей установке (mysql 5.7.x от brew, pyenv) у меня был более новый файл lib libmysqlclient.20.dylib.То, что сработало, было до pip uninstall MySQL-python и pip install MySQL-python.

7 голосов
/ 15 ноября 2015

В последней версии MySQL 5.7.9 он не поддерживается MySQL-python, и я использовал библиотеку PyMySQL. Также я добавил в manage.py (в проекте Django) эти строки для эмуляции API MySQL-python:

try:
    # load MySQLdb interface emulation
    import pymysql
    pymysql.install_as_MySQLdb()
except ImportError:
    pass
0 голосов
/ 16 марта 2019

Для таких, как я, которые нуждаются - или имеют - оба MySQLdb и PyMySQL установлены (в моем случае мне нужно было установить оба, потому что я использую PyMySQL для подключения к своим локальным экземплярам MySQL и MySQLDb для удаленных / живых экземпляров):

Убедитесь, что вы используете правильную схему URI.Чтобы получить доступ к локальным экземплярам:

LOCAL_DATABASE_URI = 'mysql+pymysql://username:password@hostname/dbname'

и в прямом эфире:

REMOTE_DATABASE_URI = 'mysql+mysqldb://username:password@hostname/dbname'

Создание этого различия решило проблему для меня

...