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.
_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.dylibanywhere 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_PATHsetting? If not,
try adding it.
- If so, you’ll have to ensure that the
libmysqlclient.16.dylibfile is not corrupt. My
copy, installed in
/opt/local/lib/mysql5/mysql/libmysqlclient.16.dylib, courtesy of
MacPorts, has MD5 signature
c79ee91af08057dfc269ee212915801aand is 1,462,376 bytes in size. What does your copy look like?
Just set the
DYLD_LIBRARY_PATH after running
pip install or
Should do the job assuming your MySQL installation lives under
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
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
pip install --upgrade MySQL-python fixed my problem.
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.
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
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