Python: MySQLdb and "Library not loaded: libmysqlclient.16.dylib"

PythonMysqlMacosOsx Snow-Leopard

Python Problem Overview


##The setup... Trying to set up a clean Mac os X 10.6 install to develop python/django and I didn't remember running into this on 10.5.

After installing MySQL from the installer on mysql-5.5.8-osx10.6-x86_64.dmg I ran

$ sudo pip install MySQL-python

and it seemed to go smoothly (output below)

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

after this I tried:

$ python -c "import MySQLdb"

and it crapped out on me with:

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

##So on to my question...

What did I do wrong?/What else do I need to do?

Googling (and searching here) for this returns a lot of results getting this error message with Ruby not too many with Python tho.

Python Solutions


Solution 1 - Python

Just set the DYLD_LIBRARY_PATH after running pip install or easy_install:

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

Should do the job assuming your MySQL installation lives under /usr/local/mysql.

Solution 2 - Python

_mysql.so refers to libmysqlclient.16.dylib. That is, the shared library that serves as the bridge between Python and the MySQL client library, _mysql.so, refers to the dynamic library for the MySQL client library, and that library cannot be loaded for some reason.

Questions you need to answer:

  • Is there a libmysqlclient.16.dylib anywhere on your system? If not, you need to install the MySQL client software.
  • If so, is the directory containing that library in your DYLD_LIBRARY_PATH setting? If not, try adding it.
  • If so, you'll have to ensure that the libmysqlclient.16.dylib file is not corrupt. My copy, installed in /opt/local/lib/mysql5/mysql/libmysqlclient.16.dylib, courtesy of MacPorts, has MD5 signature c79ee91af08057dfc269ee212915801a and is 1,462,376 bytes in size. What does your copy look like?

Solution 3 - Python

After easy_install, I create a soft link that solved the problem

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib

Solution 4 - Python

It can also crop up if your MySQL client is newer than your MySQL-python package. In my case, I had a libmysqlclient_r.18.dylib on my machine, but not a libmysqlclient_r.16.dylib. Running pip search mysql revealed

> MySQL-python - Python > interface to MySQL INSTALLED: 1.2.3 > LATEST: 1.2.3c1

and running pip install --upgrade MySQL-python fixed my problem.

Solution 5 - Python

On my setup (mysql 5.7.x from brew, pyenv), I had a newer lib file libmysqlclient.20.dylib. What worked was to pip uninstall MySQL-python and pip install MySQL-python.

Solution 6 - Python

On the latest version of MySQL 5.7.9 it's no support from MySQL-python and I used the PyMySQL library instead. Also I added in manage.py (in Django project) these lines to emulate API of MySQL-python:

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

Solution 7 - Python

For those like me who need - or have - both MySQLdb & PyMySQL installed (in my case, I needed to have both installed because I use PyMySQL to connect to my local MySQL instances, and MySQLDb for remote/live instances):

Be sure you're using the right URI scheme. To access the local instances:

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

and for live:

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

Making this distinction solved the issue for me

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionrennatView Question on Stackoverflow
Solution 1 - PythonlukmdoView Answer on Stackoverflow
Solution 2 - PythonBrian ClapperView Answer on Stackoverflow
Solution 3 - PythonmsbanikView Answer on Stackoverflow
Solution 4 - PythonCatherine DevlinView Answer on Stackoverflow
Solution 5 - PythonGiannisView Answer on Stackoverflow
Solution 6 - PythonAnton DanilchenkoView Answer on Stackoverflow
Solution 7 - Pythonkip2View Answer on Stackoverflow