2

Я пытался несколько недель и недель безуспешно устанавливать MySQL-python на Mac OS X 10.6 с Python 7.0 из дистрибутива Enthought Python. Многие из проблем, с которыми я столкнулся, были описаны в других постах, и я почти уверен, что прочитал все из них, но все еще не могу решить эту проблему. Я попытался установить и переустановить различные пакеты MySQL для 64-битной OS X, но, наконец, просто скомпилировал его с нуля. MySQL, насколько я знаю, работает и живет в каталоге /usr/local/mysql-5.5.9-osx10.6-x86/.

Я смог установить MySQL-python-1.2.3 с помощью "sudo setup.py install". Однако, когда я импортирую его, я получаю сообщение об ошибке:

$ python
Enthought Python Distribution -- www.enthought.com
Version: 7.0-2 (64-bit)

Python 2.7.1 |EPD 7.0-2 (64-bit)| (r271:86832, Dec  3 2010, 15:56:20) 
[GCC 4.0.1 (Apple Inc. build 5488)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.macosx-10.5-x86_64/egg/MySQLdb/__init__.py", line 19, in <module>

  File "build/bdist.macosx-10.5-x86_64/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.5-x86_64/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/foo/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/foo/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so
  Reason: image not found

Я посмотрел, чтобы увидеть, как другие авторы здесь предлагают, что _mysql.so ссылается с помощью otool:

$ otool -L /Users/foo/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so
/Users/foo/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so:
    libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 438.0.0)

Правильный файл, кажется, существует здесь:

$ ls -al /usr/local/mysql-5.5.9-osx10.6-x86/lib/libmysqlclient.16.dylib
-rwxr-xr-x  1 root  wheel  3539752 Jan 20  2011 /usr/local/mysql-5.5.9-osx10.6-x86/lib/libmysqlclient.16.dylib

Я попробовал несколько подходов, чтобы _mysql.so распознал этот файл:

  1. Создание символических ссылок, как предлагали другие, на нужный файл:

    $ sudo ln -s /usr/local/mysql-5.5.9-osx10.6-x86/lib/libmysqlclient.16.dylib /usr/lib/libmysqlclient.18.dylib

когда я делаю это, я получаю новую ошибку:

>>> import MySQLdb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.macosx-10.5-x86_64/egg/MySQLdb/__init__.py", line 19, in <module>

  File "build/bdist.macosx-10.5-x86_64/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.5-x86_64/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/foo/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/foo/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so
  Reason: no suitable image found.  Did find:
    /usr/lib/libmysqlclient.18.dylib: mach-o, but wrong architecture
  1. Установка DYLD_LIBRARY_PATH следующим образом (после удаления предыдущей символической ссылки):

    $ export DYLD_LIBRARY_PATH = $ DYLD_LIBRARY_PATH:/usr/local/mysql-5.5.9-osx10.6-x86/lib/

Тогда я получаю ту же ошибку, что и изначально:

>>> import MySQLdb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.macosx-10.5-x86_64/egg/MySQLdb/__init__.py", line 19, in <module>

  File "build/bdist.macosx-10.5-x86_64/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.5-x86_64/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/foo/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/foo/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so
  Reason: image not found
  1. Я также пытался, как Нед предложил использовать install_name_tool, чтобы изменить ссылку

    из каталога ~/.python-eggs:

    пытается изменить 18 на 16: $ sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql-5.5.9-osx10.6-x86/libmysqlclient.16.dylib _mysql.so

    подход 2: попытка изменить 18 на 18: sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql-5.5.9-osx10.6-x86/lib/mysql/libmysqlclient.18.dylib _mysql.so

Когда я пробую это, я получаю ошибку:

>>> import MySQLdb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.macosx-10.5-x86_64/egg/MySQLdb/__init__.py", line 19, in <module>

ImportError: dynamic module does not define init function (init_mysql)

Любые идеи о том, что можно сделать, чтобы это исправить? Я бы очень хотел, чтобы этот пакет работал ... Я пытался некоторое время и не мог заставить его работать. Я понимаю, что это общая проблема, но я не смог заставить работать ни одно из опубликованных решений.

Большое спасибо за вашу помощь.

3 ответа3

1

На самом деле в Enthought EPD MySQLdb доступен, он просто не установлен по умолчанию. Чтобы установить его:

enpkg MySQL_python

Это не очень хорошо задокументировано. Вот все дополнительные пакеты: http://www.enthought.com/products/repository.php Удачи!

1

Сначала я бы открыл терминал и:

python <enter>
import sys <enter>
print sys.path <enter>

Ваша релевантная библиотека находится на пути?

В теории MacPorts (@fideli выше) есть еще одна PMS под названием Homebrew http://mxcl.github.com/homebrew/. Он работает на удивление хорошо для управления пакетами на Mac.

Тем не менее, я делал это (полностью скомпилировано) в прошлом с дополнительной болью, которую я делал на G5 PPC64. Я начал работать над тем, чтобы скомпилировать Python, Python-MySQL, MySQL и mod_wsgi из исходного кода. Это возможно, но главная ловушка, с которой сталкиваются люди, - несоответствие архитектуры между пакетами. Вот мои заметки о том, как сделать это на КПП. Извлеките из него все, что можете, и, если вам нужна дополнительная помощь, сообщите нам об этом. Ключевой частью, на которую следует обратить внимание, является экспорт ARCHFLAGS перед каждой компиляцией. Это обеспечит соответствие архитектуры. Как я уже сказал ниже, это то, что я сделал для среды PPC64, однако вы можете просто заменить arch соответствующей платформой, например, x86_64, так как вы используете 10.6, мы знаем, что у вас есть чип Intel. Вы можете игнорировать точные версии программного обеспечения, так как они не должны быть такими уж важными. Я надеюсь, что это полезно для вас.

Замечание: Похоже, ваш MySQL 32-битный, а ваш Python 64-битный.

Предварительные данные:

  • Целевая платформа была OSX 10.5.8 (PPC64).
  • Цель состояла в том, чтобы скомпилировать все дистрибутивы как "толстые" двоичные файлы, что означает, что он будет поддерживать x86, PPC, PPC64 и x86_64.
  • Управляйте этим так, как считаете нужным для вашей целевой платформы.

This file will go through the steps of how to
install Python, MySQL, MySQLdb-Python, and
mod_wsgi on clean MacOSX 10.5.8 all 64Bit
#################################################
1.Download Python Source -> Plan 2.7
2.Download MySQL Source -> Plan 5.1.50
3.Download MySQLdb-Python Source -> Plan 1.2.3
4.Download mod_wsgi -> Plan 1.3.3

Untar all of the above and prep for Python
#################################################
1. export ARCHFLAGS='-arch i386 -arch ppc -arch ppc64 -arch x86_64'
2. ./configure --with-framework-name=Python64 --with-universal-archs=all --enable-framework --enable-universalsdk=/ MACOSX_DEPLOYMENT_TARGET=10.5
3. make
4. sudo make install
5. Add to /etc/paths
-> /usr/local/bin
6. Modify /etc/profile
-> if [ -x /usr/libexec/path_helper ]; then
-> PATH=""
-> eval `/usr/libexec/path_helper -s` <- Be sure to note these are backticks ie Shell expansion
-> fi
7. Reboot the system
8. Test Python Intereter is @2.7

Compile and Install mod_wsgi
#################################################
1. export ARCHFLAGS='-arch i386 -arch ppc -arch ppc64 -arch x86_64'
2. ./configure --with-apxs=/usr/sbin/apxs --with-python=/usr/local/bin
3. make
4. sudo make install
5. Add to /etc/apache2/httpd.conf
-> LoadModule wsgi_module libexec/apache2/mod_wsgi.so
6. tail -f /var/log/apache2/error_log
7. sudo apachectl stop
8. sudo apachectl start

Compile and Install MySQL
#################################################
NOTE: It has been said to also set CFLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64"
NOTE: It has been said to also set CXXFLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64"
1. export ARCHFLAGS='-arch ppc64'
2. CFLAGS="-arch ppc64' CXXLAGS="-arch ppc64' ./configure -prefix=/usr/local/mysql -with-server-suffix=-standard -enable-thread-safe-client -enable-local-infile -enable-shared -with-zlib-dir=bundled -with-big-tables -with-readline -with-plugins=all -without-docs
3. make
4. sudo make install
5. cd /usr/local/mysql
6. sudo ./bin/mysql_install_db --user=mysql
7. sudo chown -R mysql ./var
8. create file com.mysql.mysqld.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>com.mysql.mysqld</string>
<key>Program</key>
<string>/usr/local/mysql/bin/mysqld_safe</string>
<key>RunAtLoad</key>
<true/>
<key>UserName</key>
<string>mysql</string>
<key>WorkingDirectory</key>
<string>/usr/local/mysql</string>
</dict>
</plist>

9. sudo mv ~/Desktop/com.mysql.mysqld.plist /Library/LaunchDaemons
10. sudo chown root /Library/LaunchDaemons/com.mysql.mysqld.plist
11. sudo launchctl load -w /Library/LaunchDaemons/com.mysql.mysqld.plist
12. edit /etc/paths
-> /usr/local/mysql/bin
13. Quit all running terminals
14. run mysql_secure_installation

Compile and Install MySQLdb-Python
#################################################
NOTE: According to the compilation flags above it "should" be safe to leave Threadsafe at true
NOTE: setuptools must be installed prior to attempting the below
1. Set Threadsafe=False in site.cfg
2. export ARCHFLAGS='-arch i386 -arch ppc -arch ppc64 -arch x86_64'
3. python setup.py build
4. sudo python setup.py install
5. python-all <-Universal app, python is aliased to python32 so the next step will fail
6. import MySQLdb
7. hopefully no errors

0 comments
October 4, 2010 by Chris Barker
Django Deployment on Leopard PPC64 Research
See Step By Step HOWTO.txt
#################################################

Links that have proven useful
#################################################
http://tickletik.blogspot.com/2008/12/python-and-mysql-on-64bit.html <-Best all inclusive article
http://mysql-python.blogspot.com/2008/03/i-am-not-dead.html
http://mail.python.org/pipermail/pythonmac-sig/2008-June/020123.html
http://www.stereoplex.com/2008/feb/5/mac-os-x-command-and-manual-search-path-path-and-m/
http://www.softec.lu/site/DevelopersCorner/MasteringThePathHelper
http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide
http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide
http://diymacserver.com/installing-mysql/compiling-mysql-51x-in-64-bits-mode-on-leopard/
http://mysql-python.sourceforge.net/FAQ.html

Native MacOSX Leopard Bit Levels
#################################################
-Native Python (2.51) 32Bit
-Native Apache (2.2.14) 64Bit
-Native MySQL (N/A)

Build Out Python 64bit
#################################################
To Perform Universal Compilation
Execute the below prior to compiling
export ARCHFLAGS='-arch i386 -arch ppc -arch ppc64 -arch x86_64'
./configure --with-framework-name=Python64 --with-universal-archs=all --enable-framework --enable-universalsdk=/ MACOSX_DEPLOYMENT_TARGET=10.5

Adjusting The Path
------------------
Add /usr/local/bin to the top of /etc/paths
Modify /etc/profile to:
if [ -x /usr/libexec/path_helper ]; then
PATH=""
eval `/usr/libexec/path_helper -s`
fi


Build Out MySQL 64Bit
#################################################
CFLAGS="-arch ppc64" <-Perhaps not needed if export ARCHFLAGS is set first
CXXFLAGS="-arch ppc64" <-Perhaps not needed if export ARCHFLAGS is set first
export ARCHFLAGS='-arch i386 -arch ppc -arch ppc64 -arch x86_64'
./configure -prefix=/usr/local/mysql -with-server-suffix=-standard -enable-thread-safe-client -enable-local-infile -enable-shared -with-zlib-dir=bundled -with-big-tables -with-readline -with-plugins=all -without-docs
make
sudo make install

Build Out MySQLdb
#################################################
Set Threadsafe=False in site.cfg
export ARCHFLAGS='-arch i386 -arch ppc -arch ppc64 -arch x86_64'
python setup.py build
sudo python setup.py install

Build Out Apache 64Bit ??? Or Not
#################################################
No need to rebuild apache, it is native universal binary (Runs in 64bit Navtively)

Vhost notes
-----------
<VirtualHost *:80>

ServerName www.example.com
ServerAlias example.com
ServerAdmin webmaster@example.com

DocumentRoot /usr/local/www/documents

Alias /robots.txt /usr/local/www/documents/robots.txt
Alias /favicon.ico /usr/local/www/documents/favicon.ico

Alias /media/ /usr/local/www/documents/media/

<Directory /usr/local/www/documents>
Order allow,deny
Allow from all
</Directory>
WSGIPythonHome /Path/to/Python/
WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup example.com
WSGIScriptAlias / /usr/local/www/wsgi-scripts/myapp.wsgi

<Directory /usr/local/www/wsgi-scripts>
Order allow,deny
Allow from all
</Directory>

</VirtualHost>

HTTPD.conf notes
----------------
LoadModule wsgi_module libexec/apache2/mod_wsgi.so


Build Out mod_wsgi
#################################################
export ARCHFLAGS='-arch i386 -arch ppc -arch ppc64 -arch x86_64'
./configure --with-apxs=/usr/sbin/apxs --with-python/path/to/python
make
sudo make install

Cleaning Up After Compiling
#################################################
make clean
make distclean
0

Если это усложняет задачу, просто оставьте mysqldb и вместо этого используйте pymysql - это действительно легко настроить. Я хотел работать с django и пытался использовать MySQL, но он выдавал ошибку, поэтому я решил ее с помощью pymysql. Вот простой способ установить и настроить pymysql за несколько минут:

http://web-eng-help.blogspot.com/2010/09/install-mysql-5-for-python-26-and.html

Если вы хотите узнать разницу между pymysql и mysqldb, вы можете обратиться к этому:

https://stackoverflow.com/questions/7224807/what-actually-is-pymysql-and-how-it-differs-from-mysqldb-and-how-can-it-affect

Они служат почти той же цели.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .