Saya mencoba mengimpor pycurl
:
$ python -c "import pycurl"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: libcurl.so.4: cannot open shared object file: No such file or directory
Sekarang, libcurl.so.4
masuk /usr/local/lib
. Seperti yang Anda lihat, ini ada di sys.path
:
$ python -c "import sys; print(sys.path)"
['', '/usr/local/lib/python2.5/site-packages/setuptools-0.6c9-py2.5.egg',
'/usr/local/lib/python25.zip', '/usr/local/lib/python2.5',
'/usr/local/lib/python2.5/plat-linux2', '/usr/local/lib/python2.5/lib-tk',
'/usr/local/lib/python2.5/lib-dynload',
'/usr/local/lib/python2.5/sitepackages', '/usr/local/lib',
'/usr/local/lib/python2.5/site-packages']
Bantuan apa pun akan sangat dihargai.
LD_LIBRARY_PATH
dengan benar (saya pikir komentar Anda memiliki titik dua yang hilang).Jawaban:
sys.path
hanya mencari modul Python. Untuk perpustakaan terkait dinamis, jalur yang dicari harus dalamLD_LIBRARY_PATH
. Periksa apakahLD_LIBRARY_PATH
termasuk Anda/usr/local/lib
, dan jika tidak, tambahkan dan coba lagi.Beberapa informasi lebih lanjut ( sumber ):
Perbarui: untuk menyetel
LD_LIBRARY_PATH
, gunakan salah satu dari yang berikut, idealnya di~/.bashrc
file Anda atau yang setara:atau
Gunakan formulir pertama jika kosong (setara dengan string kosong, atau tidak ada sama sekali), dan formulir kedua jika tidak ada. Perhatikan penggunaan ekspor .
sumber
Pastikan modul libcurl.so Anda berada di jalur pustaka sistem, yang berbeda dan terpisah dari jalur pustaka python.
Sebuah "perbaikan cepat" adalah menambahkan jalur ini ke variabel LD_LIBRARY_PATH. Namun, menyetel lebar sistem (atau bahkan lebar akun) adalah IDE BURUK, karena dimungkinkan untuk menyetelnya sedemikian rupa sehingga beberapa program akan menemukan perpustakaan yang seharusnya tidak, atau bahkan lebih buruk, membuka lubang keamanan.
Jika "perpustakaan yang diinstal secara lokal" Anda diinstal di, misalnya, / usr / local / lib, tambahkan direktori ini ke /etc/ld.so.conf (ini adalah file teks) dan jalankan "ldconfig"
Perintah tersebut akan menjalankan utilitas caching, tetapi juga akan membuat semua "tautan simbolik" yang diperlukan agar sistem loader berfungsi. Mengejutkan bahwa "make install" untuk libcurl belum melakukan ini, tetapi mungkin saja tidak bisa jika / usr / local / lib belum ada di /etc/ld.so.conf.
NB: mungkin saja /etc/ld.so.conf Anda hanya berisi "include ld.so.conf.d / *. Conf". Anda masih dapat menambahkan jalur direktori setelahnya, atau cukup membuat file baru di dalam direktori tempat ia disertakan. Jangan lupa untuk menjalankan "ldconfig" setelahnya.
Hati-hati. Melakukan kesalahan ini dapat mengacaukan sistem Anda.
Selain itu: pastikan modul python Anda dikompilasi dengan versi libcurl ITU. Jika Anda baru saja menyalin beberapa file dari sistem lain, ini tidak akan selalu berhasil. Jika ragu, kompilasi modul Anda pada sistem tempat Anda ingin menjalankannya.
sumber
Anda juga dapat mengatur LD_RUN_PATH ke / usr / local / lib di lingkungan pengguna Anda saat Anda mengkompilasi pycurl di tempat pertama. Ini akan menyematkan / usr / local / lib dalam atribut RPATH dari modul ekstensi C. sehingga secara otomatis mengetahui di mana menemukan perpustakaan pada waktu proses tanpa harus menetapkan LD_LIBRARY_PATH pada waktu proses.
sumber
python setup.py build_ext --rpath=/usr/local/lib
saat membangun modul ekstensi untuk memanggang di rpathPunya masalah yang sama persis. Saya menginstal curl 7.19 ke / opt / curl / untuk memastikan bahwa saya tidak akan memengaruhi curl saat ini di server produksi kami. Setelah saya menautkan libcurl.so.4 ke / usr / lib:
sudo ln -s /opt/curl/lib/libcurl.so /usr/lib/libcurl.so.4
Saya masih mendapat kesalahan yang sama! Durf.
Tetapi menjalankan ldconfig membuat tautan untuk saya dan itu berhasil. Tidak perlu menyetel LD_RUN_PATH atau LD_LIBRARY_PATH sama sekali. Hanya perlu menjalankan ldconfig.
sumber
LD_LIBRARY_PATH
metode variabel lingkungan yang dijelaskan di atas. Jika Anda tidak ingin mengaturnya di~/.bashrc
(menambahkan pengaturan itu bukan ide yang baik IMO), Anda dapat menulis skrip shell yang menyetel variabel ini lalu menjalankan python, lalu memanggil skrip itu.Sebagai suplemen untuk jawaban di atas - Saya baru saja mengalami masalah serupa, dan bekerja sepenuhnya dari python yang diinstal default.
Ketika saya memanggil contoh pustaka objek bersama yang saya cari
LD_LIBRARY_PATH
, saya mendapatkan sesuatu seperti ini:Khususnya, ia bahkan tidak mengeluh tentang impor - ia mengeluh tentang file sumber!
Tetapi jika saya memaksa pemuatan objek menggunakan
LD_PRELOAD
:... Saya segera mendapatkan pesan kesalahan yang lebih berarti - tentang ketergantungan yang hilang!
Kupikir aku akan menuliskan ini di sini - cheers!
sumber
Saya menggunakan
python setup.py build_ext -R/usr/local/lib -I/usr/local/include/libcalg-1.0
dan file .so yang telah dikompilasi berada di bawah folder build. Anda bisa mengetikpython setup.py --help build_ext
untuk melihat penjelasan dari -R dan -Isumber
Bagi saya yang berhasil di sini adalah menggunakan pengelola versi seperti pyenv , yang sangat saya rekomendasikan agar lingkungan proyek dan versi paket Anda dikelola dengan baik dan terpisah dari sistem operasi.
Saya mengalami kesalahan yang sama setelah pembaruan OS, tetapi dengan mudah diperbaiki dengan
pyenv install 3.7-dev
(versi yang saya gunakan).sumber