Python mysqldb: Kitaplık yüklenmedi: libmysqlclient.18.dylib


172

Mac OS 10.6'da python 2.7 için mysqldb'yi derledim ve yükledim. İthalat yapan basit bir test dosyası oluşturdum

import MySQLdb as mysql

İlk olarak, bu komutun altı kırmızı renkle çizilir ve bilgi bana "Çözümlenmemiş içe aktarma" der. Sonra aşağıdaki basit python kodunu çalıştırmayı denedim

import MySQLdb as mysql

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

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

Yürütürken aşağıdaki hata iletisini alıyorum

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

Sorunumun çözümü ne olabilir?

EDIT: Aslında kütüphane / usr / local / mysql / lib içinde olduğunu öğrendim. Bu yüzden pydev eclipse versiyonumu nerede bulacağımı söylemeliyim. Bunu nerede ayarlayabilirim?

Yanıtlar:


323

Kütüphaneye sembolik bir link oluşturarak problemi çözdüm. yani

Gerçek kütüphane

/usr/local/mysql/lib

Sonra sembolik bir bağ oluşturdum.

/usr/lib

Komutunu kullanarak:

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

böylece aşağıdaki eşleme var:

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

Öyleydi. Ondan sonra her şey yolunda gitti.

DÜZENLE:

MacOS El Capitan'dan beri Sistem Bütünlüğü Koruması'nın ("rootless" olarak da bilinir) SIP içinde bağlantı oluşturmanızı engelleyeceğine dikkat edin /usr/lib/. Bu talimatları izleyerek SIP'yi devre dışı bırakabilirsiniz , ancak /usr/local/lib/bunun yerine bir bağlantı oluşturabilirsiniz :

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

47
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
15'te hughes

mysql55MacPorts ile yükledim ve bu hatayı çözmek için yaptım:sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib
philfreo

Mavericks benim eski symlink kaldırdıktan sonra, biraz farklı bir noktadan symlink zorunda kaldı: sudo ln -s /usr/local/mysql-5.5.29-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Matt

2
El Capitan'da çalışıyorsanız SIP'yi devre dışı bırakmanız gerekir: forums.developer.apple.com/thread/7935 .
Joshua Pinter

El Capitan'ın yeni kurulumundan sonra, bu ipucu için SIP'yi devre dışı bırakmanız gerekmediğini gördüm.
Lonoshea

135

Tercih ettiğim yöntem, uygulamanın nasıl çalıştığına bağlı olarak gerçekte kapsamda olabilecek veya olmayabilecek ortam değişkenleriyle oynamak yerine kütüphaneyi düzeltmektir. Bu aslında oldukça basit bir süreç.

İlk olarak, rahatsız edici python modülünün nerede olduğunu görmek için hata çıkışına bakın:

ImportError: dlopen (/Library/Python/2.7/site-packages/_mysql.so, 2): Kütüphane yüklenmedi: libmysqlclient.18.dylib Başvuru kaynağı: /Library/Python/2.7/site-packages/_mysql.so Sebep: resim bulunamadı

Tamam, rahatsız edici dosya /Library/Python/2.7/site-packages/_mysql.so

Sonra, _mysql.so'nun libmysqlclient'i bulması gerektiğini düşündüğü yeri bulun.

% 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)

Yani, yol bilgisi olmadan libmysqlclient.18.dylib arıyor, düzeltelim:

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

Şimdi _mysql.so kütüphanenin tam yolunu biliyor ve ortam değişkenlerinden bağımsız olarak her şey çalışıyor.

% 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)

4
Bu daha da iyi bir çözüm olmaz mıydı, bu yüzden tüm sanal verilerle düzeltir mi? sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $ VIRTUAL_ENV / lib / python2.7 / site-paketleri / _mysql.so
Brad Ruderman

1
@BradRuderman Sanırım verdiğiniz komutu çalıştırdığınızda, sadece bir tane sanal (yani mevcut) olanı düzeltirsiniz. Dahası, herkes (zararına) bir sanal ortamda çalışmaz, böylece komut satırı, yayınlanan komut kadar genel bir çözüm olmaz.
GreenAsJade

1
Verilen örnek, Sanal Ortamlarınızın her birinde düzeltmeniz gereken genel python / mysql'i düzeltmektir. Eğer benim gibi iseniz, konum _mysql.so olduğu bu ilk bölümün hemen üzerinde sırlı bu önemli bir adım.
Ben Rabidou

Bu, VirtualEnvironments içine kurulmuş _mysql.so için çalışır ve El Capitan'da SIP'in devre dışı bırakılmasını gerektirmez.
Aaron D

@Caleb :) :) (Y)
Sachin Malhotra

59

Bu sorun için sembolik bir bağ yaratmak yerine başka bir çözüm buldum.

Libmysqlclient.18.dylib dosyasının bulunduğu dizininizin yolunu DYLD_LIBRARY_PATH ortam değişkenine ayarlarsınız. Ne yaptım .bash_profile benim aşağıdaki satırı koymak:

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

Bu kadar.


7
Ayrıca / usr / local / mysql'de yüklü sürüme işaret eden bir symlink vardır, bu nedenle satırınızı şu şekilde değiştirmenizi öneririm: export DYLD_LIBRARY_PATH = / usr / local / mysql / lib /: $ DYLD_LIBRARY_PATH
gizlice

37

Benim durumumda, Mac OS X 10.9 Mavericks ile hatayı alıyordum. MySQL Topluluk Sunucusunu doğrudan DMG'nin Oracle / MySQL Web Sitesinden kurdum.

Tek yapmam gereken lib dosyalarını / usr / local / lib dizinine bağlamaktı.

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

Bonus: Mac OS X'i de çalıştırıyorsanız, libmysqlclient.18.dylib dosyası, http://apps.tempel.org/FindAnyFile gibi dosyaları bulmak için harika bir araç vardır . Başlangıçta dylib dosyasının yerini bu şekilde buldum.


1
/usr/local/libDizini oluşturmak zorunda kaldım , ama bir cazibe gibi çalıştı!
Nick Merrill

25

Bunu .profile veya .bashrc (hangisini kullanırsanız kullanın) içine koyarak buldum, bunu yapmanın en kolay yolu, sym bağlantıları kaynak dosyalarınızdaki yolları tutmaya kıyasla dağınık.

Ayrıca yoshisurfs cevap ile karşılaştırıldığında, mysql yüklendiğinde çoğu zaman mysql dizini kullanım kolaylığı için, tüm dosya adı değil, sadece mysql olarak yeniden adlandırılmalıdır.

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

2
Bu gerçekten akılcı ve basit bir cevap gibi görünüyor. Benim için iyi çalıştı - teşekkürler!
Darragh Enright

4

Bunu birkaç sanal ortamla karşılaştım.

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

İki kere çalıştı.


Benim için de çalıştı
Tho


3

Homebrew kullananlar için bunu şu şekilde düzeltebilirsiniz:

$ brew link mysql

Bu benim için çalıştı, şöyle bir bağlantı oluşturdu: /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
Joshua Grigonis

2

Benim durumumda, El Capitan'da (OSX 10.11), aşağıdakileri yapmak zorundayım ~/.bash_profile

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}"
export PATH="/usr/local/mysql/lib:${PATH}"

2

El Capitan içinde olduğunuzda, hata alırsınız: ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted "Sistem Bütünlüğü Koruması" kapatmanız gerekir.

önce Kurtarma moduna girmek için yeniden başlatın ve cmd + R tuşunu basılı tutun, ardından terminali başlatın ve komutu yazın: csrutil disableşimdi yeniden başlatıp tekrar deneyebilirsiniz.


Bir başka yolu dosyayı taşıyabilirsiniz libmysqlclient.18.dylibiçin /usr/local/libve yolu eklemek PATH=/usr/local/lib:$PATHbash_profile için. Benim için çalışıyor.
Bun Suwanparsert

1

SIP'nin (usr / lib / dosyasına erişimi önleyen) varsayılan olarak açık olduğu yeni bir Capitan kurulumunda ve kurtarma modunda olmadıkça sembol bağlantısını oluşturamazsınız. @Yannisxu'nun söylediği gibi, SIP'yi devre dışı bırakabilir ve / usr / lib / local'a bağlantınızı yapabilirsiniz ve bu işe yarayacaktır.

SIP'yi kapatmak yerine MAC OSX El Capitan'da aşağıdaki komutu kullanabilirsiniz:

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

Kök olarak oturum açabileceğiniz bir seçenek vardı ve bu SIP'yi devre dışı bırakabilir, ancak artık kullanılmayan son sürümde, buradan daha fazla bilgi edinebilirsiniz: https://forums.developer.apple.com/thread/4686

Soru:

Geliştirici Beta 1'de, root ayrıcalıklarıyla çalıştırıldığında SIP'yi devre dışı bırakabilen bir nvram önyükleme-args komutu vardır:

nvram boot-args="rootless=0"

Bu SIP'yi devre dışı bırakma seçeneği El Capitan yayın sürümünde de mevcut olacak mı? Yoksa bu kesinlikle Geliştirici Derlemeleri için mi?

Cevap:

Bu nvram boot-args komutu kaldırılacak. El Capitan yayın sürümünde mevcut olmayacak ve Developer Betas'ın bitiminden önce kaybolabilir. Gelecekteki Developer Betas için sürüm notlarını takip edin.


0

Bu sorunu yaşadım ve bunu nasıl düzelteceğimi anlamak bir süre aldı.

Benim durumum biraz farklı. MySQL sunucum 5.1.x sürümüne sahip. Ve bir şekilde MySQL-python'umu 1.2.3'ten 1.2.5'e yükselttim. Ve o zamandan beri bu sorunu almaya devam ettim, o zaman aşağıdaki yumuşak bağlantıyı ekledim.

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

MySQL 5.1.x için libmysqlclient.18.dylib olmadığı, sadece libmysqlclient.16.dylib olduğu ortaya çıktı. Bu sorunu ya MySQL-python'unuzu 1.2.3'e düşürerek ya da MySQL sunucunuzu 5.6.x'e yükselterek düzeltebilirsiniz (5.5.x'i denemedim).

MySQL'i yükseltmek benim için bir seçenek olmadığından kütüphaneyi 1.2.3'e düşürdüm.


0

http://dev.mysql.com/downloads/connector/c/ adresine gidin ve MySQL Connector / C'yi indirin. paketi aldıktan sonra yeni bir 'mysql' dizini yapın, mysql dizini altındaki Mysql Connector dosyasını açın, sonra mysql altında başka bir boş 'build' dizini yapın. MySQL Connector / C'yi oluşturmak için 'build' kullanacağız. cd build && cmake ../your-MySQL-Connector-source-dir make && make install komutunu kurduktan sonra, / usr / local altında mysql adlı bir dizin alacaksınız. ihtiyacınız olan tüm üstbilgileri ve kütüphaneleri içerir. bu dizine gidin ve üstbilgileri ve kütüphaneleri ilgili yerlere kopyalayın.


0

deneyebilirsin:

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`

0

MacOS'ta MySQL Bağlayıcısı / C hatası hakkında not (geçerli sürümüm 10.13.2'dir), mysql_config'i düzeltin ve mysqlclient veya MySQL-python'u yeniden yükleyin, işte detay

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.