Python mysqldb: Library tidak dimuat: libmysqlclient.18.dylib

172

Saya baru saja mengkompilasi dan menginstal mysqldb untuk python 2.7 di mac os saya 10.6. Saya membuat file uji sederhana yang mengimpor

import MySQLdb as mysql

Pertama, perintah ini merah digarisbawahi dan info memberitahu saya "Impor yang belum terselesaikan". Kemudian saya mencoba menjalankan kode python sederhana berikut

import MySQLdb as mysql

def main():
    conn = mysql.connect( charset="utf8", use_unicode=True, host="localhost",user="root", passwd="",db="" )

if __name__ == '__main__'():
    main()

Saat menjalankannya saya mendapatkan pesan kesalahan berikut

Traceback (most recent call last):
  File "/path/to/project/Python/src/cvdv/TestMySQLdb.py", line 4, in <module>
    import MySQLdb as mysql
  File "build/bdist.macosx-10.6-intel/egg/MySQLdb/__init__.py", line 19, in <module>
    \namespace cvdv
  File "build/bdist.macosx-10.6-intel/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.6-intel/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so
  Reason: image not found

Apa yang mungkin menjadi solusi untuk masalah saya?

EDIT: Sebenarnya saya menemukan bahwa perpustakaan terletak di / usr / local / mysql / lib. Jadi saya perlu memberi tahu versi gerhana pydev saya di mana menemukannya. Di mana saya mengatur ini?

toom
sumber

Jawaban:

323

Saya memecahkan masalah dengan membuat tautan simbolis ke perpustakaan. Yaitu

Perpustakaan aktual berada di

/usr/local/mysql/lib

Dan kemudian saya membuat tautan simbolis di

/usr/lib

Menggunakan perintah:

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

sehingga saya memiliki pemetaan berikut:

ls -l libmysqlclient.18.dylib 
lrwxr-xr-x  1 root  wheel  44 16 Jul 14:01 libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib

Itu dia. Setelah itu semuanya bekerja dengan baik.

EDIT:

Perhatikan, bahwa sejak MacOS El Capitan, Perlindungan Integritas Sistem (SIP, juga dikenal sebagai "tanpa root") akan mencegah Anda membuat tautan di /usr/lib/. Anda dapat menonaktifkan SIP dengan mengikuti instruksi ini , tetapi Anda dapat membuat tautan /usr/local/lib/sebagai gantinya:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
toom
sumber
47
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Hughes
Saya telah menginstal mysql55melalui MacPorts dan untuk mengatasi kesalahan ini saya lakukan:sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib
philfreo
Setelah Mavericks menghapus symlink lama saya, saya harus symlink dari tempat yang sedikit berbeda: sudo ln -s /usr/local/mysql-5.5.29-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Matt
2
Anda harus menonaktifkan SIP jika Anda menjalankan di El Capitan: forums.developer.apple.com/thread/7935 .
Joshua Pinter
Setelah pemasangan baru El Capitan, saya telah menemukan bahwa Anda tidak perlu menonaktifkan SIP untuk tip ini.
Lonoshea
135

Metode pilihan saya adalah untuk benar-benar memperbaiki perpustakaan daripada bermain dengan variabel lingkungan yang mungkin atau mungkin tidak benar-benar dalam ruang lingkup tergantung pada bagaimana aplikasi dijalankan. Ini sebenarnya proses yang cukup sederhana.

Pertama, lihat output kesalahan untuk melihat di mana modul python menyinggung berada:

ImportError: dlopen (/Library/Python/2.7/site-packages/_mysql.so, 2): Perpustakaan tidak dimuat: libmysqlclient.18.dylib Dirujuk dari: /Library/Python/2.7/site-packages/_mysql.so Alasan: gambar tidak ditemukan

Oke, jadi file yang menyinggung adalah /Library/Python/2.7/site-packages/_mysql.so

Selanjutnya, cari tahu di mana menurut _mysql.so ia seharusnya menemukan libmysqlclient.18.dylib:

% otool -L /Library/Python/2.7/site-packages/_mysql.so
/Library/Python/2.7/site-packages/_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 169.3.0)

Jadi, ia mencari libmysqlclient.18.dylib tanpa informasi jalur, mari perbaiki:

% sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Library/Python/2.7/site-packages/_mysql.so

Sekarang _mysql.so tahu path lengkap ke perpustakaan dan semuanya berfungsi, terlepas dari variabel lingkungan.

% otool -L /Library/Python/2.7/site-packages/_mysql.so                                                                                           
/Library/Python/2.7/site-packages/_mysql.so:
    /usr/local/mysql/lib/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 169.3.0)
Caleb Shay
sumber
4
Bukankah ini akan menjadi solusi yang lebih baik sehingga memperbaikinya dengan semua virtualenvs? sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $ VIRTUAL_ENV / lib / python2.7 / situs-paket / _mysql.so
Brad Ruderman
1
@BradRuderman Saya kira sangat penting untuk menjadi jelas bahwa ketika Anda menjalankan perintah yang Anda berikan, Anda hanya memperbaiki satu virtualenv - yang Anda miliki saat ini. Selain itu, tidak semua orang (merugikan mereka) berjalan dalam virtualenv, sehingga baris perintah tidak akan menjadi solusi umum seperti yang diposting.
GreenAsJade
1
Catatan penting contoh yang diberikan adalah memperbaiki global python / mysql Anda harus memperbaikinya di masing-masing Lingkungan Virtual Anda. Jika Anda seperti saya, Anda mengkilap bagian pertama di mana mereka berada _mysql.so itulah langkah penting.
Ben Rabidou
Ini berfungsi untuk _mysql.so yang diinstal di dalam VirtualEnvironmentments, dan tidak memerlukan penonaktifan SIP di El Capitan.
Aaron D
Terima kasih atas penjelasannya @ Caleb :) :) (Y)
Sachin Malhotra
59

Saya menemukan ada solusi lain untuk masalah ini daripada membuat tautan simbolik.

Anda menetapkan jalur ke direktori Anda, tempat libmysqlclient.18.dylib berada, menjadi DYLD_LIBRARY_PATH variabel lingkungan. Apa yang saya lakukan adalah meletakkan baris berikut di .bash_profile saya:

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

Itu dia.

yoshi
sumber
7
ada juga symlink di / usr / local / mysql yang menunjuk ke versi yang diinstal, jadi saya sarankan untuk mengubah baris Anda ke: export DYLD_LIBRARY_PATH = / usr / local / mysql / lib /: $ DYLD_LIBRARY_PATH
sneak
37

Dalam kasus saya, saya mendapatkan kesalahan dengan Mac OS X 10.9 Mavericks. Saya menginstal Server Komunitas MySQL langsung dari Situs Oracle / MySQL dari DMG.

Yang perlu saya lakukan adalah symlink file lib ke direktori / usr / local / lib.

mkdir -p /usr/local/lib   
ln -s /usr/local/mysql/lib/libmysql* /usr/local/lib

Bonus: Jika Anda menjalankan Mac OS X juga, ada alat yang hebat untuk menemukan file seperti file libmysqlclient.18.dylib, http://apps.tempel.org/FindAnyFile . Beginilah awalnya saya menemukan lokasi file dylib.

Nick Woodham
sumber
1
Saya harus membuat /usr/local/libdirektori, tetapi bekerja seperti pesona!
Nick Merrill
25

Saya menemukan meletakkan ini di .profile atau .bashrc Anda (mana saja yang Anda gunakan) adalah cara termudah untuk melakukannya, tautan sym menjadi berantakan dibandingkan dengan menyimpan path di file sumber Anda.

Juga dibandingkan dengan jawaban yoshisurfs, sebagian besar waktu ketika mysql diinstal direktori mysql harus diganti nama menjadi hanya mysql, bukan seluruh nama file, untuk kemudahan penggunaan.

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
Matthew Harrison
sumber
2
Ini sepertinya jawaban yang benar-benar waras dan sederhana. Bekerja dengan baik untuk saya - terima kasih!
Darragh Enright
4

Saya mengalami ini dengan beberapa lingkungan virtual.

pip uninstall MySQL-python
pip install -U MySQL-python

Bekerja dua kali.

John Redford
sumber
Bekerja untuk saya juga
Tho
3

Bagi mereka yang menggunakan homebrew, Anda dapat memperbaikinya dengan:

$ brew link mysql
keithpjolley
sumber
Ini bekerja untuk saya, itu membuat tautan seperti ini: /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
Joshua Grigonis
2

Dalam Kasus saya, di El Capitan (OSX 10.11), saya harus melakukan tindak lanjut ~/.bash_profile

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}"
export PATH="/usr/local/mysql/lib:${PATH}"
Krishna Sunuwar
sumber
2

ketika Anda berada di El Capitan, akan mendapatkan kesalahan: ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted harus menutup "Perlindungan Integritas Sistem".

pertama, reboot dan tahan pada cmd + R untuk masuk ke mode Recovery, kemudian jalankan terminal dan ketik perintah:, csrutil disablesekarang Anda dapat reboot dan coba lagi.

yannisxu
sumber
Cara lain Anda dapat memindahkan file libmysqlclient.18.dylibke /usr/local/libdan menambahkan path PATH=/usr/local/lib:$PATHke bash_profile. Ini bekerja untuk saya.
Bun Suwanparsert
1

Pada instalasi El Capitan baru di mana SIP (tanpa root mencegah akses ke usr / lib /) secara default dan Anda tidak dapat membuat symlink kecuali Anda berada dalam mode pemulihan. Seperti yang dikatakan @yannisxu Anda dapat menonaktifkan SIP dan melakukan symlink Anda ke / usr / lib / local dan ini akan berhasil.

Anda dapat menggunakan perintah berikut pada MAC OSX El Capitan alih-alih mematikan SIP:

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

Dulu ada opsi di mana Anda dapat login sebagai root dan ini dapat menonaktifkan SIP tetapi dalam rilis final yang sekarang sudah usang, Anda dapat membaca lebih lanjut tentang hal ini di sini: https://forums.developer.apple.com/thread/4686

Pertanyaan:

Ada perintah nvram boot-args yang tersedia di Developer Beta 1 yang dapat menonaktifkan SIP saat dijalankan dengan hak akses root:

nvram boot-args="rootless=0"

Apakah opsi menonaktifkan SIP ini juga akan tersedia dalam versi rilis El Capitan? Atau apakah ini hanya untuk Pengembang Build?

Menjawab:

Perintah nvram boot-args ini akan hilang. Ini tidak akan tersedia dalam versi rilis El Capitan dan mungkin menghilang sebelum akhir Betas Pengembang. Mengawasi catatan rilis untuk Betas Pengembang di masa depan.

mrkzq
sumber
0

Saya memiliki masalah ini dan butuh beberapa saat untuk mencari tahu cara memperbaikinya.

Kasing saya sedikit berbeda. Server MySQL saya adalah versi 5.1.x. Dan entah bagaimana saya memutakhirkan MySQL-python saya dari 1.2.3 ke 1.2.5. Dan saya terus mendapatkan masalah ini sejak saat itu ketika saya menambahkan tautan lunak berikut.

libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib

Ternyata untuk MySQL 5.1.x tidak ada libmysqlclient.18.dylib, tetapi hanya libmysqlclient.16.dylib. Anda dapat memperbaiki masalah ini dengan menurunkan versi MySQL-python ke 1.2.3 atau memutakhirkan server MySQL Anda ke 5.6.x (Saya belum mencoba 5.5.x.)

Saya menurunkan pustaka ke 1.2.3 karena memutakhirkan MySQL bukan merupakan pilihan bagi saya.

James J. Ye
sumber
0

buka http://dev.mysql.com/downloads/connector/c/ dan unduh MySQL Connector / C. setelah mendapatkan paket, buat direktori baru 'mysql', buka kompresi file Konektor Mysql di bawah direktori mysql, lalu di bawah mysql, buat direktori kosong 'build'.we akan menggunakan' build 'untuk membangun MySQL Connector / C. cd build && cmake ../your-MySQL-Connector-source-dir make && make install setelah make install, Anda akan mendapatkan direktori bernama mysql di bawah / usr / local. itu berisi semua header dan lib yang Anda butuhkan.pergi ke direktori ini, dan salin header dan lib ke lokasi yang sesuai.

pengguna6643531
sumber
0

Anda dapat mencoba:

sudo install_name_tool -change libmysqlclient.18.dylib /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so`
Xiaolin Leo
sumber
0

Catatan tentang bug Connector MySQL / C pada macOS (versi saya saat ini adalah 10.13.2), perbaiki mysql_config dan instal ulang mysqlclient atau MySQL-python, berikut ini detailnya

Woody Huang
sumber