पायथन मायस्कल्ड: लाइब्रेरी लोडेड नहीं: libmysqlclient.18.dylib


172

मैं बस अपने मैक ओएस 10.6 पर अजगर 2.7 के लिए mysqldb संकलित और स्थापित किया। मैंने एक साधारण परीक्षण फ़ाइल बनाई जो आयात करती है

import MySQLdb as mysql

सबसे पहले, यह कमांड लाल रेखांकित है और जानकारी मुझे "अनारक्षित आयात" बताती है। फिर मैंने निम्नलिखित सरल अजगर कोड को चलाने की कोशिश की

import MySQLdb as mysql

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

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

इसे निष्पादित करते समय मुझे निम्नलिखित त्रुटि संदेश मिलता है

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

मेरी समस्या का हल क्या हो सकता है?

संपादित करें: वास्तव में मुझे पता चला है कि पुस्तकालय / usr / स्थानीय / mysql / lib में निहित है। इसलिए मुझे अपने pydev ग्रहण संस्करण को बताने की आवश्यकता है कि इसे कहां खोजना है। मैं इसे कहाँ सेट करूँ?

जवाबों:


323

मैंने लाइब्रेरी में एक प्रतीकात्मक लिंक बनाकर समस्या का हल किया। अर्थात

वास्तविक पुस्तकालय में रहता है

/usr/local/mysql/lib

और फिर मैंने एक प्रतीकात्मक लिंक बनाया

/usr/lib

कमांड का उपयोग करना:

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

ताकि मेरे पास निम्नलिखित मानचित्रण हों:

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

वह यह था। उसके बाद सब कुछ ठीक ठाक चला।

संपादित करें:

ध्यान दें, कि चूंकि MacOS El Capitan सिस्टम इंटीग्रिटी प्रोटेक्शन (SIP, जिसे "रूटलेस" के रूप में भी जाना जाता है) आपको लिंक से रोक देगा /usr/lib/। आप इन निर्देशों का पालन ​​करके SIP को निष्क्रिय कर सकते हैं, लेकिन आप /usr/local/lib/इसके बजाय एक लिंक बना सकते हैं :

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
ह्यूजेस

मैंने mysql55MacPorts के माध्यम से स्थापित किया था और इस त्रुटि को हल करने के लिए किया था:sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib
फिल्पेरो

Mavericks के बाद मेरे पुराने सिम्कलिन को हटा दिया गया था, मुझे कुछ अलग जगह से सिम्मलिंक करना पड़ा: sudo ln -s /usr/local/mysql-5.5.29-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Mat

2
यदि आप El Capitan पर चल रहे हैं, तो आपको SIP को अक्षम करना होगा: forum.developer.apple.com/thread/7935
यहोशू पिंजर

एल कैपिटन की एक ताजा स्थापना के बाद, मैंने पाया है कि आपको इस टिप के लिए एसआईपी को अक्षम करने की आवश्यकता नहीं है।
लोनोशिया

135

मेरा पसंदीदा तरीका वास्तव में पर्यावरण चर के साथ खेलने के बजाय पुस्तकालय को ठीक करना है जो कि आवेदन चलाने के आधार पर वास्तव में दायरे में नहीं हो सकता है। यह वास्तव में एक काफी सरल प्रक्रिया है।

सबसे पहले, त्रुटि आउटपुट को देखने के लिए जहां आक्रामक अजगर मॉड्यूल स्थित है:

ImportError: dlopen (/Library/Python/2.7/site-packages/_mysql.so, 2): लाइब्रेरी लोडेड नहीं: libmysqlclient.18.dylib से संदर्भित: /Library/Python/2.7/site-packages/_mysqll कारण चित्र नहीं मिला

ठीक है, इसलिए अपमानजनक फ़ाइल /Library/Python/2.7/site-packages/_mysl.so है

इसके बाद, यह पता लगाएं कि _mysql.so को कहां लगता है कि उसे 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)

इसलिए, यह libmysqlclient.18.dylib की खोज कर रहा है, जिसमें कोई पथ जानकारी नहीं है, चलो इसे ठीक करें:

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

अब _mysql.so को पुस्तकालय का पूरा रास्ता पता है और पर्यावरण चर की परवाह किए बिना सब कुछ काम करता है।

% 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
यह एक बेहतर समाधान नहीं होगा तो यह सभी virtualenvs के साथ इसे ठीक करता है? sudo install_name_tool -Change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $ VIRTUAL_ENV / lib / python2.7 / साइट-संकुल / _mysql.so
ब्रैड Ruderman

1
@ ब्रैडरमैन मुझे लगता है कि यह स्पष्ट होना महत्वपूर्ण है कि जब आप अपने द्वारा दी गई कमांड चलाते हैं, तो आप केवल एक वर्चुअन को ठीक करते हैं - आपका वर्तमान एक। इसके अलावा, हर कोई (अपने प्रतिबंध के लिए) एक virtualenv में नहीं चल रहा है, ताकि कमांड लाइन सामान्य रूप से एक पोस्ट के रूप में एक समाधान नहीं होगा।
ग्रीनएजजेड

1
महत्वपूर्ण उदाहरण दिया गया उदाहरण वैश्विक अजगर / mysql को ठीक कर रहा है जिसे आपको अपने वर्चुअल वातावरण में से प्रत्येक में ठीक करना होगा। यदि आप मुझे पसंद करते हैं, तो आप उस पहले भाग पर सही चमकते हैं जहाँ वे स्थान हैं। _mysql.so एक महत्वपूर्ण कदम है।
बजे बेन रबिदौ

यह VirtualEn वातावरण के अंदर स्थापित _mysql.so के लिए काम करता है, और एल कैपिटन में एसआईपी को अक्षम करने की आवश्यकता नहीं है।
आरोन डी

स्पष्टीकरण के लिए धन्यवाद @ कालेब :) :) (वाई)
सचिन मल्होत्रा

59

मैंने पाया कि प्रतीकात्मक लिंक बनाने के बजाय इस समस्या का एक और समाधान था।

आप अपनी निर्देशिका के लिए पथ सेट करते हैं, जहाँ libmysqlclient.18.dylib DYLD_LIBRARY_PATH परिवेश चर में रहता है। मैंने जो किया है वह मेरे .bash_profile में निम्नलिखित पंक्ति डालने के लिए है:

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

बस।


7
/ हमर / usr / लोकल / mysql पर एक सिमलिंक भी है जो इंस्टॉल किए गए संस्करण की ओर इशारा करता है, इसलिए मैं आपकी लाइन को बदलने का सुझाव देता हूं: DYLD_LIBRARY_PATH = / usr / local / mysql (lib /: $ DYLD_LIBRARY_PATH
sneak

37

मेरे मामले में, मुझे मैक ओएस एक्स 10.9 मावेरिक्स के साथ त्रुटि मिल रही थी। मैंने DMG से Oracle / MySQL वेबसाइट से सीधे MySQL कम्युनिटी सर्वर स्थापित किया।

मुझे बस इतना करने की आवश्यकता थी कि / /rr / local / lib निर्देशिका के लिए लिबास फ़ाइलों को सीलिंक किया जाए।

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

बोनस: यदि आप Mac OS X भी चला रहे हैं, तो libmysqlclient.18.dylib फ़ाइल, http://apps.tempel.org/FindAnyFile जैसी फ़ाइलों को खोजने का एक बढ़िया उपकरण है । यह है कि मैं मूल रूप से फाइल फाइल का स्थान कैसे पाया।


1
मुझे /usr/local/libनिर्देशिका बनाना था , लेकिन एक आकर्षण की तरह काम किया!
निक मेरिल

25

मैंने इसे आपके .profile या .bashrc (जो भी आप उपयोग करते हैं) में डालते हुए पाया कि ऐसा करने का सबसे आसान तरीका है, आपके स्रोत फ़ाइलों में पथ रखने की तुलना में सिम्पल लिंक गड़बड़ हैं।

इसके अलावा yoshisurfs उत्तर की तुलना में, जब mysql स्थापित हो जाता है तो अधिकांश समय mysql निर्देशिका का नाम बदला जाना चाहिए केवल उपयोग में आसानी के लिए, संपूर्ण फ़ाइल नाम नहीं।

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

2
यह वास्तव में बहुत ही सरल और सरल उत्तर की तरह लगता है। मेरे लिए अच्छा काम किया - धन्यवाद!
दारोगा एनराइट

4

मैं एक आभासी वातावरण के साथ इस में भाग लिया है।

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

दोनों बार काम किया।


मेरे लिए भी काम किया
Tho


3

होमब्रे का उपयोग करने वालों के लिए आप इसे ठीक कर सकते हैं:

$ brew link mysql

> /Usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib - /usr/local/lib/libmysqlclient.18.dylib: यह मेरे लिए काम किया है, यह इस तरह एक लिंक बनाया है
यहोशू Grigonis

2

मेरे मामले में, एल कैपिटन (OSX 10.11) में, मुझे निम्नलिखित में करना होगा ~/.bash_profile

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

2

जब आप El Capitan में हैं, तो त्रुटि मिलेगी: ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted "सिस्टम इंटीग्रिटी प्रोटेक्शन" को बंद करने की आवश्यकता है।

पहले, रिबूट करें और रिकवरी मोड में प्रवेश करने के लिए cmd + R पर पकड़ें, फिर टर्मिनल लॉन्च करें और कमांड टाइप करें: csrutil disableअब आप रिबूट और फिर से कोशिश कर सकते हैं।


दूसरे तरीके से आप फ़ाइल libmysqlclient.18.dylibको स्थानांतरित कर सकते हैं /usr/local/libऔर PATH=/usr/local/lib:$PATHbash_profile के लिए पथ जोड़ सकते हैं । यह मेरे लिए काम कर रहा है।
बन सुवानपररोर

1

नए एल कैपिटन इंस्टॉलेशन पर जहां एसआईपी (रूटलेस usr / lib / एक्सेस को रोकता है) डिफॉल्ट रूप से होता है और जब तक आप रिकवरी मोड में नहीं होते हैं तब तक आप सीलिंक नहीं बना सकते हैं। जैसा कि @yannisxu ने कहा कि आप SIP को निष्क्रिय कर सकते हैं और अपने सहानुभूति / usr / lib / स्थानीय पर काम कर सकते हैं और यह काम करेगा।

आप SIP को बंद करने के बजाय मैक OSX El Capitan पर निम्न कमांड का उपयोग कर सकते हैं:

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

एक विकल्प हुआ करता था जहाँ आप रूट के रूप में लॉगिन कर सकते हैं और यह SIP को निष्क्रिय कर सकता है लेकिन अंतिम रिलीज़ में जो अब अप्रचलित है, आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं: https://forums.developer.apple.com/thread/4686

सवाल:

डेवलपर बीटा 1 में एक nvram बूट-आर्ग कमांड उपलब्ध है जो रूट विशेषाधिकारों के साथ चलने पर SIP को अक्षम कर सकता है:

nvram boot-args="rootless=0"

क्या SIP को निष्क्रिय करने का यह विकल्प El Capitan रिलीज़ संस्करण में भी उपलब्ध होगा? या यह डेवलपर बिल्ड्स के लिए सख्ती से है?

उत्तर:

यह nvram बूट-आर्ग्स कमांड दूर जा रहा है। यह El Capitan रिलीज संस्करण में उपलब्ध नहीं होगा और डेवलपर बेटस के अंत से पहले गायब हो सकता है। भविष्य के डेवलपर बेटों के रिलीज़ नोटों पर नज़र रखें।


0

मेरे पास यह मुद्दा था और मुझे यह पता लगाने में थोड़ी देर लगी कि इसे कैसे ठीक किया जाए।

मेरा मामला थोड़ा अलग है। मेरा MySQL सर्वर 5.1.x संस्करण का है। और किसी तरह मैंने अपने MySQL-python को 1.2.3 से 1.2.5 तक अपग्रेड किया। और मैं इस मुद्दे को तब से प्राप्त करता रहा जब से मैंने निम्न सॉफ्ट लिंक जोड़ा।

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

यह पता चला है कि MySQL 5.1.x के लिए कोई libmysqlclient.18.dylib नहीं है, लेकिन केवल libmysqlclient.16.dylib है। आप इस समस्या को या तो MySQL-python को 1.2.3 पर डाउनग्रेड कर सकते हैं या अपने MySQL सर्वर को 5.6.x पर अपग्रेड कर सकते हैं (मैंने 5.5.x की कोशिश नहीं की है।)

मैंने लाइब्रेरी को 1.2.3 पर डाउनग्रेड किया क्योंकि MySQL अपग्रेड करना मेरे लिए कोई विकल्प नहीं है।


0

करने के लिए जाना http://dev.mysql.com/downloads/connector/c/ और MySQL कनेक्टर / सी डाउनलोड करें। पैकेज प्राप्त करने के बाद, एक नई निर्देशिका 'mysql' बनाएं, निर्देशिका mysql के तहत Mysql कनेक्टर फ़ाइल को अनलॉक्ड करें, फिर mysql के तहत, एक और खाली निर्देशिका 'build' बनायें। हम' Samsung 'का उपयोग करके' Samsung 'कनेक्टर का निर्माण करेंगे। cd build && cmake ../your-MySQL-Connector-source-dir मेक && मेक इन इंस्टाल होने के बाद, आपको mysql नाम की एक डाइरेक्टरी / usr / local मिल जाएगी। इसमें सभी हेडर और लिबास शामिल हैं जिनकी आपको आवश्यकता है। इस डाइरेक्ट्री पर जाएं, और हेडर और लिबास को संबंधित स्थानों पर कॉपी करें।



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.