可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I've been at this for some time and read many sites on the subject. suspect I have junk lying about causing this problem. But where?
This is the error when I import MySQLdb in 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
I'm trying for 64 bit so checked here:
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
Have set my default version of python to 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
Tried deleting build directory and python setup.py clean
Renamed Python/2.5/site-packages so it could not try and pick that up.
UPDATE
Deleted everything and followed the instructions here: Django + MySQL on Mac OS 10.6.2 Snow Leopard installing using macports.
But basically still get the same error
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
>>>
回答1:
When the interpreter says is:
You have installed MySQL_python-1.2.3c1 in /Library/Python/2.6/site-packages
but you are adding to sys.path another version in /users/phoebebr/Downloads.
When I try to import MySQLdb from the second directory, I've found that
_mysql.so is from another architecture.
SO, it seems that you ended with the wrong version of MySQLdb. Delete
/Users/phoebebr/.python-eggs/MySQL_python-1.2.3c1-py2.6-macosx-10.6-universal.egg-tmp and /Users/phoebebr/Downloads/MySQL-python-1.2.3c1. Test again to see if the version
in /library works. If not, donwload the binary for MacOS. In last instance, download
the source of MySQL-python and compile it.
回答2:
I have a fresh MacBook Air, and I managed to get MySQLdb working by doing the following:
(Snow Leopard 10.6.6, preinstalled Python)
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
Download the MySQL 32-bit dmg file from mysql pages, Install it.
Add the following lines to your ~/.profile (or ~/.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
After saving, type the following in the terminal:
source ~/.profile
Download the MySQL-python-1.2.3.tar.gz unzip, untar, cd to that directory
python2.5 setup.py build
sudo python2.5 setup.py install
exit that directory (or you'll get a warning)
python2.5
import MySQLdb
or
python
import MySQLdb
works the way it should!!
回答3:
I just struggled with the same, despite the many answers, so I'll risk adding another:
- Run
python -c 'import platform; print platform.platform()'
. Does it end in "64 bit"?
- Do
ls -l /usr/local/mysql
. It's a symlink: does it end in "x86_64"?
If python says "64 bit", then you want mysql for "x86_64" (search for that at http://dev.mysql.com/downloads/mysql/). If python says "32 bit", then you probably want the "x86" mysql. If you have a match, but it still doesn't work, then read the other answers (about VERSIONER_PYTHON_PREFER_32_BIT etc.)
For me, the mismatch caused the "mach-o, but wrong architecture"
error. The next error was "Library not loaded: libmysqlclient.18.dylib... Reason: image not found"
.
To solve this one, I recommend adding a symlink (rather than set DYLD_LIBRARY_PATH, as explained in other answers):
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/
回答4:
It's caused by that your Python is 32bits, but somehow, the installed MySQL library is 64bits. To solve the problem, here you can install it manually with following commands:
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
With ARCHFLAGS="-arch i386", it should be compiled as i386 architecture.
回答5:
This is a shot in the dark - not familiar with MACOSX - but I saw a similar problem under Linux and could only resolve it by:
- Uninstalling all MySQLdb components via the package manager
- Doing a low level search to locate any remaining directories and files relating to MySQLdb - if you manually installed/built MySQLdb you will probably find some references to it somewhere but most likely in the site-packages directory - I did and simply deleteing them is the recommended approach based upon the research I did
Next I tried to import MySQLdb and made sure I got a simple error that the package did not exisit - at least I knew MySQLdb was 100% removed
Then I a clean install via the package manager if that option exists as it will be 100% compatible with your platform and libs. Compiling etc. is great but you have to do lots of leg work to make sure that you have the right MySQL client libs etc. to link to (based upon my painful experience)
Good luck.
Worst case ... you could use the alternative PyMySQL pure python option (http://pypi.python.org/pypi/PyMySQL/0.2) but I have to confess most people recommend MySQLdb
回答6:
It appears that this issue is related to the version of mysql that you have on the box. When compiling the python mysql component it uses mysql_config which usually lives in /usr/local/mysql/bin to determine what flags to pass to CC when compiling the mysql component. If you have a 32 bit version of mysql running then you will get a 32 version of this component even if you have the 64 bit version of python. As an example I had the following version of mysql...
/usr/local/mysql-5.5.16-osx10.6-x86 and I should have been running...
/usr/local/mysql-5.5.16-osx10.6-x86_64
Changing over to the 64bit version of mysql on my machine and then running...
sudo pip install mysql-python
fixed the problem for me. You can run the following command to verify how it is going to build the mysql component...
/usr/local/mysql/bin/mysql_config --cflags
You should see something like this...
-I/usr/local/mysql/include -Os -g -fno-common -fno-strict-aliasing -arch x86_64
回答7:
I got another possible solution to add.
I solved the problem by adding the following line to .profile
(.bash_profile
is ok if it's a development machine):
export VERSIONER_PYTHON_PREFER_64_BIT=yes
export VERSIONER_PYTHON_PREFER_32_BIT=no
(2nd line might not be necessary, though. But after hours of fiddling, trying, recompiling, I just couldn't be bothered trying this out anymore).
回答8:
This problem was solved for me by selecting the correct python version. If you installed with macports:
sudo port select python python26
回答9:
I met the same problem.
My situation: Mac OSX 10.6, python is 64 bit, mysql is 32 bit, and _mysql.so is 32 bit.
Solution: uninstall mysql (http://steveno.wordpress.com/2009/03/26/uninstall-mysql-on-mac-os-x/), and install 64 bit mysql. Then make sure mysql_config is pointed to the one you just installed.
IMPORTANT:
remove all the _mysql.so in the MySQL-python-1.2.3 directory (this is what you download) or just remove the whole directory and generate it again from the tar file. Then build and install again. Then _mysql.so will be 64 bit. Now you can import it. If you see dyld: Library not loaded
, then export DYLD_LIBRARY_PATH=/usr/local/mysql/lib
回答10:
I had the same problem with MySQLdb in Mac OS X and Ubuntu, so I switched to the official MysQL Python Connector: (available on PyPI):
sudo pip install mysql-connector-python
or by download from:
http://dev.mysql.com/downloads/connector/python/
Documentation:
http://dev.mysql.com/doc/refman/5.5/en/connector-python.html
It's easy to use and also compatible with PEP 249 (Python DB API version 2.0).
回答11:
Additional note to make the problem clear:
The error message is:
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
The mach-o, but wrong architecture error means that python and _mysql.so have different architecture(32-bit/64-bit binary). We can check it by:
file $(which python)
file /Users/phoebebr/.python-eggs/MySQL_python-1.2.3c1-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so
And if they do not match, we should make them match. For me, my _mysql.so is 32-bit (I happened to installed the 32-bit mysql), and my python2.7 runs in 64-bit by default. I force python runs in 32-bit by:
export VERSIONER_PYTHON_PREFER_32_BIT=yes
And problem solved.
python 2.6+ can run in 64 or 32-bit mode, check How do I determine if my python shell is executing in 32bit or 64bit mode on OS X?
回答12:
I had the same problem with my ElCaptain Mac and solved the problem following this other post. Just use brew and your problem is solved.