Executable Python tidak menemukan libpython shared library

143

Saya menginstal Python 2.7 pada CentOS 5. Saya membuat dan menginstal Python sebagai berikut

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

Ketika saya mencoba menjalankan / usr / local / bin / python, saya mendapatkan pesan kesalahan ini

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

Ketika saya menjalankan ldd di / usr / local / bin / python, saya mengerti

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)

Bagaimana saya memberi tahu Python di mana menemukan libpython?

tanpa
sumber

Jawaban:

203

Coba yang berikut ini:

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

Ganti /usr/local/libdengan folder tempat Anda menginstalnya libpython2.7.so.1.0jika tidak ada /usr/local/lib.

Jika ini berhasil dan Anda ingin menjadikan perubahan itu permanen, Anda memiliki dua opsi:

  1. Tambahkan export LD_LIBRARY_PATH=/usr/local/libke .profiledirektori home Anda (ini hanya berfungsi jika Anda menggunakan shell yang memuat file ini ketika instance shell baru dimulai). Pengaturan ini hanya akan memengaruhi pengguna Anda.

  2. Tambahkan /usr/local/libke /etc/ld.so.confdan jalankan ldconfig. Ini tentu saja merupakan pengaturan seluruh sistem.

Tamas
sumber
Apakah ada cara untuk mengekspornya agar berfungsi dengan eclipse? Saya telah menambahkannya ke profil saya. Namun kemudian Eclipse tidak dapat meluncurkan gdb. (Catatan: Menambahkannya ke ld.so.conf berfungsi)
Setheron
jadi saya memeriksa variabel lingkungan yang berjalan dengan gerhana dan memang memiliki LD_LIBRARY_PATH yang tepat. Saya percaya bahwa ketika meluncurkan GDB tidak menggunakan shell dan karenanya tidak mendapatkan variabel lingkungan! Mengatur libpython dalam konfigurasi debug tidak membantu karena itu hanya untuk saat gdb benar-benar memuat (tetapi saya memerlukan lib untuk gdb itu sendiri untuk memuat)
Setheron
1
Bisakah Anda men-debug aplikasi dengan sukses ketika Anda menjalankan gdbdari baris perintah dan LD_LIBRARY_PATH diatur dengan benar di terminal? Jika tidak, Anda mungkin harus menyiapkan LD_LIBRARY_PATH dalam .gdbinitfile Anda . Lihat jawaban ini untuk info lebih lanjut: stackoverflow.com/a/7041845/156771
Tamás
Saya memerlukan LD_LIBRARY_PATH untuk meluncurkan gdb (python libs) bukan untuk debugging aplikasi saya yang sebenarnya. Sejauh ini saya hanya berhasil memperbaikinya dengan mengaturnya di ldconfig. Saya dapat men-debug aplikasi melalui CLI karena itu akan mengambil LD_LIBRARY_PATH dari file ZSHRC saya.
Setheron
10
Hanya sebuah catatan untuk siapa saja yang mencoba ini: Ini hanya "/ usr / local / lib", dan bukan awal "sertakan" seperti aslinya "sertakan ld.so.conf.d / *. Conf".
timss
79

Mengenakan topi penggali kuburku ...

Cara terbaik yang saya temukan untuk mengatasi ini adalah pada waktu kompilasi. Karena Anda satu-satunya awalan pengaturan mungkin juga memberitahu yang dapat dieksekusi secara eksplisit di mana menemukan pustaka bersama. Tidak seperti OpenSSL dan paket perangkat lunak lain, Python tidak memberi Anda petunjuk konfigurasi yang bagus untuk menangani jalur pustaka alternatif (tidak semua orang adalah root, Anda tahu ...) Dalam kasus paling sederhana yang Anda butuhkan adalah yang berikut:

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

Atau jika Anda lebih suka versi non-linux:

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

rpathBendera " " memberi tahu python bahwa ia memiliki pustaka runtime yang dibutuhkan di jalur tertentu. Anda dapat mengambil ide ini lebih jauh untuk menangani dependensi yang diinstal ke lokasi yang berbeda dari lokasi sistem standar. Sebagai contoh, pada sistem saya karena saya tidak memiliki akses root dan perlu membuat instalasi Python hampir sepenuhnya mandiri, baris configure saya terlihat seperti ini:

./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"

Dalam hal ini saya kompilasi perpustakaan yang menggunakan python (seperti ffi, readline, dll) ke dalam extlibdirektori di dalam direktori pohon python itu sendiri. Dengan cara ini saya bisa tar direktori python - $ {PYTHON_VERSION} dan mendarat di mana saja dan itu akan "bekerja" (asalkan Anda tidak mengalami libcatau libmkonflik). Ini juga membantu ketika mencoba menjalankan beberapa versi Python pada kotak yang sama, karena Anda tidak perlu terus mengubah LD_LIBRARY_PATHatau khawatir tentang mengambil versi yang salah dari pustaka Python.

Sunting: Lupa menyebutkan, kompilasi akan mengeluh jika Anda tidak mengatur PYTHONPATHvariabel lingkungan ke apa yang Anda gunakan sebagai awalan dan gagal mengkompilasi beberapa modul, misalnya, untuk memperluas contoh di atas, atur PYTHONPATHke awalan yang digunakan di atas contoh dengan export PYTHONPATH=/apps/python-${PYTHON_VERSION}...

Astaga
sumber
//, ini seperti yang aku cari. Di mana saya dapat menemukan lebih banyak tentang cara untuk "tar direktori versi python dan mendarat di mana saja dan itu akan" berfungsi "(asalkan Anda tidak mengalami konflik libc atau libm)" ? Apakah menurut Anda layak membuat pertanyaan stackoverflow.com terpisah dari ini?
Nathan Basanese
//, Juga, bagaimana seharusnya satu set $PYTHON_VERSION?
Nathan Basanese
//, saya atur $PYTHON_VERSIONsetelah mengkonfigurasi. Bahkan dengan $PYTHON_VERSIONset, kompiler mengeluh tentangPython build finished successfully! The necessary bits to build these optional modules were not found: _bz2 _curses _curses_panel _gdbm _lzma _sqlite3 _tkinter readline
Nathan Basanese
//, Apakah ini memerlukan modifikasi pada makeperintah dan perintah instalasi lainnya?
Nathan Basanese
1
@NathanBasanese dalam kasus bz2 yang hilang, kutukan, gdbm, lzma, dll, Anda perlu mengkompilasi masing-masing yang pertama dengan awalan /apps/python-${PYTHON_VERSION}/extlibuntuk memastikan perpustakaan dan header mereka berada di lokasi yang tepat untuk proses pembuatan Python untuk menemukan. Mengenai paket tingkat sistem, Anda mungkin akan terjebak mengandalkan pengguna root untuk menginstalnya untuk Anda sebelumnya. Atau menemukan alternatif yang dapat dikompilasi dan mendarat diextlib
Foosh
21

Saya memiliki masalah yang sama dan saya menyelesaikannya dengan cara ini:

Jika Anda tahu di mana libpython berada, saya kira itu akan ada /usr/local/lib/libpython2.7.so.1.0dalam kasus Anda, Anda bisa membuat tautan simbolik ke sana:

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

Kemudian coba jalankan lddlagi dan lihat apakah itu berhasil.

Omer Dagan
sumber
6

Saya menginstal Python 3.5 oleh Software Collections di CentOS 7 minimal. Semuanya bekerja dengan baik sendiri, tetapi saya melihat kesalahan pustaka bersama yang disebutkan dalam pertanyaan ini ketika saya mencoba menjalankan skrip CGI sederhana:

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

Saya menginginkan solusi permanen sistemwide yang berfungsi untuk semua pengguna, sehingga tidak termasuk menambahkan pernyataan ekspor ke file .profile atau .bashrc. Ada solusi satu baris, berdasarkan halaman solusi Red Hat . Terima kasih atas komentar yang menunjukkan:

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

Setelah restart, semuanya baik-baik saja, tetapi kadang-kadang server web saya masih mengeluh. Ada pendekatan lain yang selalu bekerja untuk shell dan server, dan lebih umum. Saya melihat solusinya di sini dan kemudian menyadari itu sebenarnya disebutkan dalam salah satu jawaban di sini juga! Bagaimanapun, pada CentOS 7, ini adalah langkah-langkahnya:

 vim /etc/ld.so.conf

Yang di komputer saya baru saja:

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

Jadi saya membuat file baru:

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

Dan menambahkan:

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

Dan untuk membangun kembali cache secara manual:

sudo ldconfig

Itu saja, skrip bekerja dengan baik!

Ini adalah solusi sementara, yang tidak bekerja lintas reboot:

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

Opsi -v (verbose) hanya untuk melihat apa yang sedang terjadi. Saya melihat bahwa ia melakukannya: / 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

Kesalahan khusus ini hilang. Kebetulan, saya harus chownpengguna untuk apache untuk menyingkirkan kesalahan izin setelah itu.

Perhatikan bahwa saya menggunakan find untuk mencari direktori untuk perpustakaan. Anda juga bisa:

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

Yang di VM saya kembali:

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

Yang merupakan jalur yang perlu saya berikan kepada ldconfig, seperti yang ditunjukkan di atas.

Nagev
sumber
1
Anda bisa menyelamatkan diri Anda dari beberapa masalah dengan pergi ke /etc/profile.d dan membuat file dengan yang berikut di dalamnya: #!/bin/bashdan source scl_source enable rh-python35di dalamnya. access.redhat.com/solutions/527703
Doug
2

Pada Solaris 11

Gunakan LD_LIBRARY_PATH_64untuk menyelesaikan symlink ke python libs.

Dalam kasus saya untuk python3.6 LD_LIBRARY_PATHtidak berhasil tetapi LD_LIBRARY_PATH_64tidak.

Semoga ini membantu.
Salam

basy
sumber
1

Ini bekerja untuk saya ...

$ sudo apt-get install python2.7-dev
Kyle Anderson
sumber
Hai ini bukan solusi yang benar, karena setelah ini, biner python build kustom Anda menggunakan .so dari yang Anda instal dari apt-get. Ini dapat menyebabkan masalah ketika mereka memiliki versi yang sama, atau jika Anda mengubah kode sumber python, itu tidak akan membutuhkan upaya.
Azusa Nakano
0

Saya menginstal menggunakan perintah:

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

make

Sekarang, sebagai pengguna root:

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

Kemudian saya mencoba mengeksekusi python dan mendapatkan error:

/ usr / local / bin / python: kesalahan saat memuat pustaka bersama: libpython2.7.so.1.0: tidak dapat membuka file objek bersama: Tidak ada file atau direktori

Kemudian, saya keluar dari root dan kembali mencoba mengeksekusi Python dan berhasil.

Pankaj
sumber
0

Yang dibutuhkan hanyalah instalasi file dev libpython [3 atau 2].


sumber
-1

cukup instal python-lib. (python27-lib). Ini akan menginstal libpython2.7.so1.0. Kami tidak perlu mengatur apa pun secara manual.

chintan-p-bhatt
sumber
4
//, dan jika kamu aktif, katakanlah, CEntOS 6.3? Ini tidak berfungsi, di sana, dan biasanya orang mengkompilasi Python untuk menangani kasus di mana sistem Python adalah versi aneh, rusak, tidak dapat diandalkan, atau keinginan lain untuk tidak menyentuh keseluruhan sistem.
Nathan Basanese