Python ที่ปฏิบัติการไม่พบไลบรารีที่ใช้ร่วมกันของ libpython


143

ฉันกำลังติดตั้ง Python 2.7 บน CentOS 5 ฉันสร้างและติดตั้ง Python ดังนี้

./configure --enable-shared --prefix=/usr/local
make
make install

เมื่อฉันพยายามเรียกใช้ / usr / local / bin / python ฉันได้รับข้อความแสดงข้อผิดพลาดนี้

/usr/local/bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

เมื่อฉันเรียกใช้ ldd บน / usr / local / bin / python ฉันจะได้รับ

ldd /usr/local/bin/python
    libpython2.7.so.1.0 => not found
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030e9a00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000030e9200000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00000030fa200000)
    libm.so.6 => /lib64/libm.so.6 (0x00000030e9600000)
    libc.so.6 => /lib64/libc.so.6 (0x00000030e8e00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000030e8a00000)

ฉันจะบอก Python ว่าจะหา libpython ได้อย่างไร

คำตอบ:


204

ลองทำสิ่งต่อไปนี้:

LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python

แทนที่/usr/local/libด้วยโฟลเดอร์ที่คุณติดตั้งlibpython2.7.so.1.0หากไม่ได้อยู่ใน/usr/local/libนั้น

หากวิธีนี้ใช้ได้ผลและคุณต้องการทำการเปลี่ยนแปลงแบบถาวรคุณมีสองตัวเลือก:

  1. เพิ่มexport LD_LIBRARY_PATH=/usr/local/libลง.profileในโฮมไดเรกทอรีของคุณ (ใช้งานได้เฉพาะเมื่อคุณใช้เชลล์ซึ่งโหลดไฟล์นี้เมื่อเริ่มเชลล์อินสแตนซ์ใหม่) การตั้งค่านี้จะส่งผลกระทบต่อผู้ใช้ของคุณเท่านั้น

  2. เพิ่ม/usr/local/libไปและเรียกใช้/etc/ld.so.conf ldconfigนี่คือการตั้งค่าทั่วทั้งระบบแน่นอน


มีวิธีการส่งออกเพื่อให้ทำงานกับ eclipse หรือไม่ ฉันได้เพิ่มลงใน. profile ของฉันอย่างไรก็ตาม Eclipse จะไม่สามารถเปิดใช้ gdb ได้ (หมายเหตุ: การเพิ่มลงใน ld.so.conf สามารถทำงานได้)
Setheron

ดังนั้นฉันจึงตรวจสอบว่าตัวแปรสภาวะแวดล้อม eclipse กำลังรันด้วยและมี LD_LIBRARY_PATH ที่เหมาะสม ฉันเชื่อว่าเมื่อมันเปิดตัว GDB มันไม่ได้ใช้เชลล์เลยดังนั้นจึงไม่ได้รับตัวแปรสภาพแวดล้อมใด ๆ ! การตั้งค่า libpython ในการกำหนดค่าการแก้ปัญหาไม่ได้ช่วยค่านับว่าเป็นเฉพาะเมื่อ gdb จริงโหลด ( แต่ฉันต้อง lib สำหรับ gdb ตัวเองไปโหลด)
Setheron

1
คุณสามารถดีบักแอปพลิเคชันสำเร็จเมื่อคุณเรียกใช้gdbจากบรรทัดคำสั่งและตั้งค่า LD_LIBRARY_PATH อย่างถูกต้องในเทอร์มินัลหรือไม่ หากไม่มีคุณอาจต้องตั้งค่า LD_LIBRARY_PATH ใน.gdbinitไฟล์ของคุณ ดูคำตอบนี้สำหรับข้อมูลเพิ่มเติม: stackoverflow.com/a/7041845/156771
Tamás

ฉันต้องการ LD_LIBRARY_PATH เพื่อเรียกใช้ gdb (python libs) ไม่ใช่สำหรับการดีบักแอปพลิเคชันของฉัน จนถึงตอนนี้ฉันสามารถแก้ไขได้โดยการตั้งค่าใน ldconfig ฉันสามารถดีบักแอปพลิเคชันผ่าน CLI เพราะมันจะดึง LD_LIBRARY_PATH จากไฟล์ ZSHRC ของฉัน
Setheron

10
เพียงแค่ทราบสำหรับทุกคนที่ลองสิ่งนี้: เป็นเพียง "/ usr / local / lib" และไม่ใช่ "เริ่มต้น" รวมถึง "เริ่มต้น" เป็นต้นฉบับ "รวมถึง ld.so.conf.d / *. conf"
timss

79

ใส่หมวก gravedigger ของฉัน ...

วิธีที่ดีที่สุดที่ฉันพบว่าอยู่ในเวลารวบรวม เนื่องจากคุณเป็นคำนำหน้าการตั้งค่าอย่างใดอย่างหนึ่งก็อาจบอกปฏิบัติการที่จะหาห้องสมุดสาธารณะที่ใช้ร่วมกันอย่างชัดเจน แตกต่างจาก OpenSSL และแพคเกจซอฟต์แวร์อื่น ๆ Python ไม่ได้ให้คำสั่งกำหนดค่าที่ดีแก่คุณในการจัดการเส้นทางไลบรารีทางเลือก (ไม่ใช่ทุกคนที่เป็นรูทคุณก็รู้ ... ) ในกรณีที่ง่ายที่สุด

./configure --enable-shared \
            --prefix=/usr/local \
            LDFLAGS="-Wl,--rpath=/usr/local/lib"

หรือถ้าคุณชอบเวอร์ชั่นที่ไม่ใช่ linux:

./configure --enable-shared \
            --prefix=/usr/local \
            LDFLAGS="-R/usr/local/lib"

ว่า " rpathธง" บอกหลามก็มีห้องสมุดรันไทม์จะต้องในเส้นทางโดยเฉพาะอย่างยิ่งที่ คุณสามารถนำแนวคิดนี้ไปใช้เพื่อจัดการการพึ่งพาที่ติดตั้งไปยังตำแหน่งอื่นนอกเหนือจากที่ตั้งระบบมาตรฐาน ตัวอย่างเช่นในระบบของฉันเนื่องจากฉันไม่มีการเข้าถึงรูทและต้องทำการติดตั้ง Python แบบครบวงจรเกือบทั้งหมดบรรทัดการกำหนดค่าของฉันมีลักษณะดังนี้:

./configure --enable-shared \
            --with-system-ffi \
            --with-system-expat \
            --enable-unicode=ucs4 \
            --prefix=/apps/python-${PYTHON_VERSION} \
            LDFLAGS="-L/apps/python-${PYTHON_VERSION}/extlib/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/extlib/lib" \
            CPPFLAGS="-I/apps/python-${PYTHON_VERSION}/extlib/include"

ในกรณีนี้ผมกำลังรวบรวมห้องสมุดที่ใช้หลาม (เช่นffi, readlineฯลฯ ) ลงในextlibไดเรกทอรีภายในต้นไม้ไดเรกทอรีหลามตัวเอง วิธีนี้ฉันสามารถ tar python - ไดเรกทอรี $ {PYTHON_VERSION} และลงที่ใดก็ได้และมันจะ "ทำงาน" (หากคุณไม่ได้เจอlibcหรือlibmขัดแย้งกัน) นอกจากนี้ยังช่วยเมื่อพยายามเรียกใช้ Python หลายรุ่นในกล่องเดียวกันเนื่องจากคุณไม่จำเป็นต้องเปลี่ยนLD_LIBRARY_PATHหรือกังวลเกี่ยวกับการหยิบ Python ไลบรารี่รุ่นผิด ๆ

แก้ไข: ลืมพูดถึงคอมไพล์จะบ่นหากคุณไม่ได้ตั้งค่าPYTHONPATHตัวแปรสภาพแวดล้อมเป็นสิ่งที่คุณใช้เป็นคำนำหน้าและไม่สามารถรวบรวมบางโมดูลเช่นเพื่อขยายตัวอย่างข้างต้นตั้งค่าPYTHONPATHคำนำหน้าที่ใช้ในข้างต้น ตัวอย่างกับexport PYTHONPATH=/apps/python-${PYTHON_VERSION}...


//, นี่ดูเหมือนสิ่งที่ฉันกำลังมองหา ฉันจะหาข้อมูลเพิ่มเติมเกี่ยวกับวิธีการ"tar ไดเรกทอรี python และนำไปใช้ได้ทุกที่และจะ" ทำงาน "(หากคุณไม่พบข้อขัดแย้ง libc หรือ libm)" ? คุณคิดว่ามันคุ้มค่าหรือไม่ที่จะแยกคำถาม stackoverflow.com ออกจากสิ่งนี้
Nathan Basanese

//, ยังไง, หนึ่งชุดควรทำยัง$PYTHON_VERSIONไง?
Nathan Basanese

//, ฉันตั้งค่า$PYTHON_VERSIONหลังจากกำหนดค่า ถึงแม้จะมีการ$PYTHON_VERSIONตั้งค่าคอมไพเลอร์บ่นเกี่ยวกับPython build finished successfully! The necessary bits to build these optional modules were not found: _bz2 _curses _curses_panel _gdbm _lzma _sqlite3 _tkinter readline
นาธาน Basanese

//, สิ่งนี้ต้องการการแก้ไขmakeคำสั่งและคำสั่งการติดตั้งอื่น ๆ หรือไม่?
Nathan Basanese

1
@NathanBasanese ในกรณีของ bz2, curses, gdbm, lzma ที่หายไปคุณจะต้องรวบรวมแต่ละอันก่อนด้วยคำนำหน้าของ/apps/python-${PYTHON_VERSION}/extlibเพื่อให้แน่ใจว่าไลบรารีและส่วนหัวของพวกเขาอยู่ในตำแหน่งที่เหมาะสมสำหรับกระบวนการ Python ในการค้นหา สำหรับแพ็คเกจระดับระบบคุณอาจติดอยู่กับผู้ใช้รูทเพื่อติดตั้งแพ็กเกจให้คุณก่อน หรือค้นหาทางเลือกที่สามารถรวบรวมและลงจอดได้ในextlib
Foosh

21

ฉันมีปัญหาเดียวกันและฉันแก้ไขด้วยวิธีนี้:

หากคุณรู้ว่ามี libpython อยู่ที่ไหนฉันคิดว่ามันน่าจะเป็น/usr/local/lib/libpython2.7.so.1.0ในกรณีของคุณคุณสามารถสร้างลิงก์สัญลักษณ์ไปที่:

sudo ln -s /usr/local/lib/libpython2.7.so.1.0 /usr/lib/libpython2.7.so.1.0

จากนั้นลองเรียกใช้lddอีกครั้งและดูว่าใช้งานได้หรือไม่


6

ฉันติดตั้ง Python 3.5 โดยSoftware Collectionsบน CentOS 7 ให้น้อยที่สุด ทุกอย่างทำงานได้ด้วยตัวเอง แต่ฉันเห็นข้อผิดพลาดของไลบรารีที่ใช้ร่วมกันที่กล่าวถึงในคำถามนี้เมื่อฉันพยายามเรียกใช้สคริปต์ CGI อย่างง่าย:

tail /var/log/httpd/error_log
AH01215: /opt/rh/rh-python35/root/usr/bin/python: error while loading shared libraries: libpython3.5m.so.rh-python35-1.0: cannot open shared object file: No such file or directory

ฉันต้องการโซลูชันถาวรทั้งระบบที่ใช้งานได้กับผู้ใช้ทั้งหมดดังนั้นจึงไม่รวมการเพิ่มคำสั่งส่งออกไปยังไฟล์. profile หรือ. bashrc มีวิธีแก้ปัญหาแบบบรรทัดเดียวอ้างอิงจากหน้าโซลูชัน Red Hat ขอบคุณสำหรับความคิดเห็นที่ชี้ให้เห็น:

echo 'source scl_source enable rh-python35' | sudo tee --append /etc/profile.d/python35.sh

หลังจากรีสตาร์ททุกอย่างดีบนเชลล์ แต่บางครั้งเว็บเซิร์ฟเวอร์ของฉันก็ยังบ่นอยู่ มีวิธีการอื่นที่ใช้งานได้กับทั้งเชลล์และเซิร์ฟเวอร์และเป็นวิธีทั่วไปมากกว่า ฉันเห็นวิธีแก้ปัญหาที่นี่และจากนั้นก็รู้ว่ามันถูกกล่าวถึงจริงในหนึ่งในคำตอบที่นี่เช่นกัน! อย่างไรก็ตามใน CentOS 7 เหล่านี้เป็นขั้นตอน:

 vim /etc/ld.so.conf

ซึ่งบนเครื่องของฉันเพิ่งมี:

include ld.so.conf.d/*.conf

ดังนั้นฉันจึงสร้างไฟล์ใหม่:

vim /etc/ld.so.conf.d/rh-python35.conf

และเพิ่ม:

/opt/rh/rh-python35/root/usr/lib64/

และสร้างแคชใหม่ด้วยตนเอง:

sudo ldconfig

นั่นมันสคริปต์ทำงานได้ดี!

นี่เป็นวิธีแก้ปัญหาชั่วคราวซึ่งไม่สามารถใช้การรีบูตได้:

sudo ldconfig /opt/rh/rh-python35/root/usr/lib64/ -v

ตัวเลือก -v (verbose) เป็นเพียงเพื่อดูว่าเกิดอะไรขึ้น ฉันเห็นว่ามันทำ: / opt / rh / rh-python35 / root / usr / lib64: libpython3.so.rh-python35 -> libpython3.so.rh-python35 libpython3.5m.so.rh-python35-1.0 - libpython3.5m.so.rh-python35-1.0

ข้อผิดพลาดนี้หายไป อนึ่งฉันต้องให้chownผู้ใช้ apache เพื่อกำจัดข้อผิดพลาดการอนุญาตหลังจากนั้น

โปรดทราบว่าฉันใช้findเพื่อค้นหาไดเรกทอรีสำหรับไลบรารี คุณสามารถทำได้:

sudo yum install mlocate
sudo updatedb
locate libpython3.5m.so.rh-python35-1.0

ซึ่ง VM ของฉันส่งคืน:

/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0

ซึ่งเป็นเส้นทางที่ฉันต้องให้กับ ldconfig ดังที่แสดงด้านบน


1
คุณสามารถช่วยตัวเองได้ด้วยการไปที่ /etc/profile.d และสร้างไฟล์ที่มีดังต่อไปนี้: #!/bin/bashและsource scl_source enable rh-python35ในนั้น access.redhat.com/solutions/527703
Doug

2

บน Solaris 11

ใช้LD_LIBRARY_PATH_64เพื่อแก้ไข symlink เพื่อ libs หลาม

ในกรณีของฉันสำหรับ python3.6 LD_LIBRARY_PATHไม่ทำงาน แต่LD_LIBRARY_PATH_64ทำ

หวังว่านี่จะช่วยได้
ความนับถือ


1

สิ่งนี้ใช้ได้กับฉัน ...

$ sudo apt-get install python2.7-dev

สวัสดีนี่ไม่ใช่วิธีการแก้ปัญหาที่ถูกต้องเพราะหลังจากนี้ไบนารีการสร้างแบบหลามแบบกำหนดเองของคุณกำลังใช้. so จากสิ่งที่คุณติดตั้งจาก apt-get สิ่งนี้อาจทำให้เกิดปัญหาในขณะที่มีเวอร์ชันเดียวกันหรือหากคุณแก้ไขซอร์สโค้ดหลามก็จะไม่พยายาม
Azusa Nakano

0

ฉันติดตั้งโดยใช้คำสั่ง:

./configure --prefix=/usr       \
            --enable-shared     \
            --with-system-expat \
            --with-system-ffi   \
            --enable-unicode=ucs4 &&

make

ตอนนี้ในฐานะผู้ใช้รูท:

make install &&
chmod -v 755 /usr/lib/libpython2.7.so.1.0

จากนั้นฉันพยายามรัน python และได้รับข้อผิดพลาด:

/ usr / local / bin / python: เกิดข้อผิดพลาดขณะโหลดไลบรารีที่แชร์: libpython2.7.so.1.0: ไม่สามารถเปิดไฟล์วัตถุที่แชร์ได้: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

จากนั้นฉันล็อกเอาต์จากผู้ใช้รูทและพยายามรัน Python อีกครั้งและทำงานได้สำเร็จ


0

สิ่งที่จำเป็นทั้งหมดคือการติดตั้งการติดตั้งไฟล์ libpython [3 หรือ 2] dev


-1

เพียงติดตั้ง python-lib (python27-lib) มันจะติดตั้ง libpython2.7.so1.0 เราไม่จำเป็นต้องตั้งค่าอะไรด้วยตนเอง


4
//, และถ้าคุณอยู่, พูด, CEntOS 6.3? มันใช้งานไม่ได้ตรงนั้นและโดยทั่วไปผู้คนกำลังรวบรวม Python เพื่อจัดการกับกรณีที่ระบบ Python เป็นรุ่นแปลก ๆ แตกหักไม่น่าเชื่อถือหรือมีความปรารถนาอื่นที่จะไม่สัมผัสระบบโดยรวม
Nathan Basanese
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.