Python mysqldb: ไลบรารีไม่ได้โหลด: libmysqlclient.18.dylib


172

ฉันเพิ่งคอมไพล์และติดตั้ง mysqldb สำหรับ python 2.7 บน mac os 10.6 ฉันสร้างไฟล์ทดสอบอย่างง่ายที่นำเข้า

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 / local / mysql / lib ดังนั้นฉันต้องบอกรุ่น pydev eclipse ของฉันเพื่อค้นหา ฉันจะตั้งค่านี้ที่ไหน

คำตอบ:


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 ระบบ Integrity ป้องกัน (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
ฮิวจ์

ฉันได้ติดตั้งmysql55ผ่านทาง MacPorts และเพื่อแก้ไขข้อผิดพลาดนี้ได้:sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib
philfreo

หลังจาก Mavericks ลบออก symlink เก่าของฉันฉันจะต้อง symlink จากจุดที่แตกต่างกันเล็กน้อย: sudo ln -s /usr/local/mysql-5.5.29-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
แมตต์

2
คุณจะต้องปิดการใช้งาน SIP ถ้าคุณกำลังทำงานอยู่บน El Capitan: forums.developer.apple.com/thread/7935
Joshua Pinter

หลังจากติดตั้ง El Capitan ใหม่ฉันพบว่าคุณไม่จำเป็นต้องปิดใช้งาน SIP สำหรับเคล็ดลับนี้
Lonoshea

135

วิธีที่ฉันชอบคือการแก้ไขไลบรารีแทนที่จะเล่นกับตัวแปรสภาพแวดล้อมที่อาจอยู่ในขอบเขตจริงหรือไม่ขึ้นอยู่กับวิธีการเรียกใช้แอปพลิเคชัน นี่เป็นกระบวนการที่ค่อนข้างง่าย

ก่อนอื่นให้ดูที่เอาต์พุตข้อผิดพลาดเพื่อดูตำแหน่งของโมดูลไพ ธ อนที่ผิด:

ImportError: dlopen (/Library/Python/2.7/site-packages/_mysql.so, 2): ไม่ได้โหลดไลบรารี: libmysqlclient.18.dylib อ้างอิงจาก: /Library/Python/2.7/site-packages/_mysql.so เหตุผล: ไม่พบภาพ

โอเคไฟล์ที่ละเมิดคือ /Library/Python/2.7/site-packages/_mysql.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
นี่จะไม่เป็นทางออกที่ดียิ่งขึ้นเพื่อแก้ไขด้วย virtualenv ทั้งหมดหรือไม่ sudo install_name_tool -Change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $ VIRTUAL_ENV / lib / python2.7 เว็บไซต์ / แพคเกจ / _mysql.so
แบรด Ruderman

1
@BradRuderman ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะต้องชัดเจนว่าเมื่อคุณเรียกใช้คำสั่งที่คุณได้รับคุณจะต้องแก้ไข virtualenv หนึ่งเท่านั้น - ของคุณในปัจจุบัน นอกจากนี้ไม่ใช่ทุกคนที่ทำงานใน virtualenv (เพื่อความเสียหาย) ดังนั้นบรรทัดคำสั่งจะไม่เหมือนกับโซลูชันทั่วไปที่โพสต์
GreenAsJade

1
หมายเหตุสำคัญตัวอย่างที่ให้ไว้คือการแก้ไข python / mysql ทั่วโลกที่คุณจะต้องแก้ไขในสภาพแวดล้อมเสมือนจริงของคุณ หากคุณเป็นเหมือนฉันคุณจะเห็นส่วนแรกที่พวกมันอยู่ _mysql.so นั่นเป็นขั้นตอนสำคัญ
Ben Rabidou

ใช้งานได้กับ _mysql.so ที่ติดตั้งไว้ใน VirtualEnvironment และไม่ต้องการปิดใช้งาน SIP ใน El Capitan
Aaron D

ขอบคุณสำหรับคำอธิบาย @Caleb :) :) (Y)
Sachin Malhotra

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
นอกจากนี้ยังมี symlink ที่ / usr / local / mysql ซึ่งชี้ไปที่เวอร์ชันที่ติดตั้งดังนั้นฉันขอแนะนำให้คุณเปลี่ยนสายของคุณเป็น: export DYLD_LIBRARY_PATH = / usr / local / mysql / lib /: $ DYLD_LIBRARY_PATH
แอบ

37

ในกรณีของฉันฉันได้รับข้อผิดพลาดกับ Mac OS X 10.9 Mavericks ฉันติดตั้ง MySQL Community Server โดยตรงจากเว็บไซต์ Oracle / MySQL จาก DMG

สิ่งที่ฉันต้องทำคือ symlink ไฟล์ lib ไปยังไดเร็กทอรี / usr / 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 นี่คือวิธีที่ฉันพบตำแหน่งของไฟล์ dylib


1
ฉันต้องสร้าง/usr/local/libไดเรกทอรี แต่ทำงานเหมือนมีเสน่ห์!
Nick Merrill

25

ฉันพบว่าการใส่สิ่งนี้ลงใน. profile หรือ. bashrc (ไม่ว่าคุณจะใช้วิธีใด) เป็นวิธีที่ง่ายที่สุดในการทำลิงค์ sym นั้นยุ่งเมื่อเทียบกับการเก็บพา ธ ในไฟล์ต้นฉบับของคุณ

เมื่อเทียบกับคำตอบ yoshisurfs ส่วนใหญ่เวลาที่ mysql ได้รับการติดตั้งไดเรกทอรี mysql ควรเปลี่ยนชื่อเป็น mysql ไม่ใช่ชื่อไฟล์ทั้งหมดเพื่อความสะดวกในการใช้งาน

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

2
ดูเหมือนว่าคำตอบที่ง่ายและมีสติจริงๆ ทำงานได้ดีสำหรับฉัน - ขอบคุณ!
Darragh Enright



3

สำหรับผู้ใช้ homebrew คุณอาจแก้ไขได้ด้วย:

$ brew link mysql

นี้ทำงานสำหรับฉันมันสร้างการเชื่อมโยงเช่นนี้ /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
โจชัว Grigonis

2

ในกรณีของฉันใน El Capitan (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:$PATHไปยัง bash_profile มันใช้งานได้สำหรับฉัน
บุญสุวรรณพาร์เซต์

1

ในการติดตั้ง El Capitan ใหม่ที่ SIP (รูทป้องกันการเข้าถึง usr / lib /) เปิดใช้งานตามค่าเริ่มต้นและคุณไม่สามารถสร้าง symlink ได้เว้นแต่คุณจะอยู่ในโหมดการกู้คืน ดังที่ @ yannisxu กล่าวว่าคุณสามารถปิดใช้งาน SIP และทำ symlink ของคุณไปที่ / usr / lib / local และสิ่งนี้จะทำงาน

คุณสามารถใช้คำสั่งต่อไปนี้บน MAC OSX El Capitan แทนการปิด SIP:

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

เคยมีตัวเลือกที่คุณสามารถเข้าสู่ระบบในฐานะ root และสามารถปิดการใช้งาน SIP แต่ในรุ่นสุดท้ายที่ล้าสมัยในขณะนี้คุณสามารถอ่านเพิ่มเติมได้ที่นี่: https://forums.developer.apple.com/thread/4686

คำถาม:

มีคำสั่ง nvram boot-args พร้อมใช้งานใน Developer Beta 1 ซึ่งสามารถปิดใช้งาน SIP เมื่อทำงานด้วยสิทธิ์พิเศษของรูท:

nvram boot-args="rootless=0"

ตัวเลือกในการปิดใช้งาน SIP นี้จะมีให้ในรุ่นวางจำหน่าย El Capitan หรือไม่ หรือสิ่งนี้เป็นข้อ จำกัด สำหรับ Developer Builds หรือไม่

ตอบ:

คำสั่ง boot-args ของ nvram นี้กำลังจะหายไป จะไม่สามารถใช้ได้ในรุ่นวางจำหน่าย El Capitan และอาจหายไปก่อนสิ้นสุด Betas สำหรับนักพัฒนา จับตามองบันทึกย่อประจำรุ่นสำหรับนักพัฒนาในอนาคต


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 Connector / C หลังจากได้รับแพคเกจให้สร้างไดเรกทอรีใหม่ 'mysql' คลายการบีบอัดไฟล์ Mysql Connector ภายใต้ไดเรกทอรี mysql จากนั้นภายใต้ mysql ให้สร้างไดเรกทอรีว่างอีก 'build'.we จะใช้' สร้าง 'เพื่อสร้าง MySQL Connector / C cd build && cmake ../your-MySQL-Connector-source-dir ทำการ && ทำการติดตั้งหลังจากทำการติดตั้งคุณจะได้รับไดเรกทอรีชื่อ mysql ภายใต้ / usr / local มันมีส่วนหัวและ libs ทั้งหมดที่คุณต้องการไปที่ dirctory นี้และคัดลอกส่วนหัวและ libs ไปยังตำแหน่งที่เกี่ยวข้อง


0

คุณสามารถลอง:

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`

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.