Python yürütülebilir libpython paylaşılan kütüphanesini bulamıyor


143

CentOS 5'e Python 2.7 yüklüyorum. Python'u aşağıdaki gibi kurdum ve kurdum

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

/ Usr / local / bin / python komutunu çalıştırmayı denediğimde bu hata iletisini alıyorum

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

/ Usr / local / bin / python üzerinde ldd'yi çalıştırdığımda,

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'a libpython'u nerede bulacağını nasıl söyleyebilirim?

Yanıtlar:


204

Takip etmeyi dene:

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

İçinde değilse /usr/local/lib, yüklediğiniz klasörle değiştirin .libpython2.7.so.1.0/usr/local/lib

Bu işe yararsa ve değişiklikleri kalıcı yapmak istiyorsanız, iki seçeneğiniz vardır:

  1. Ekle export LD_LIBRARY_PATH=/usr/local/libadresinden Müşteri .profileana dizininizde (bir kabuk kullanması durumunda bu işleri hangi yükleri yeni kabuk örneği başlatıldığında bu dosya). Bu ayar yalnızca kullanıcılarınızı etkiler.

  2. Ekle /usr/local/libiçin /etc/ld.so.confve çalıştırın ldconfig. Bu elbette sistem çapında bir ayardır.


Tutulma ile çalışacak şekilde dışa aktarmanın bir yolu var mı? Bunu benim .profile'ma ekledim ancak Eclipse gdb'yi başlatamıyor. (Not: ld.so.conf
dosyasına

eclipse ile çalışan ortam değişkenlerini kontrol ettim ve uygun LD_LIBRARY_PATH var. GDB'yi başlattığında herhangi bir kabuk kullanmadığından ortam değişkenleri almadığına inanıyorum! Hata ayıklama yapılandırmasında libpython'u ayarlamak, bu sadece gdb gerçekten yüklendiğinde (ancak ben gdb'nin yüklenmesi için
lib'e

1
gdbKomut satırından çalıştırdığınızda ve LD_LIBRARY_PATH terminalde doğru şekilde ayarlandığında uygulamada hata ayıklayabilir misiniz ? Değilse, muhtemelen .gdbinitdosyanızda LD_LIBRARY_PATH ayarlamanız gerekir . Daha fazla bilgi için bu cevaba bakınız: stackoverflow.com/a/7041845/156771
Tamás

Uygulamamın gerçek hata ayıklaması için değil başlatma gdb (python libs) için LD_LIBRARY_PATH gerekir. Şimdiye kadar sadece ldconfig içinde ayarlayarak düzeltmeyi başardım. LD_LIBRARY_PATH uygulamasını ZSHRC dosyamdan alacağı için CLI aracılığıyla uygulamada hata ayıklayabilirim.
Setheron

10
Bunu deneyen herkes için sadece bir not: Sadece "/ usr / local / lib" ve orijinal olarak başlangıç ​​"include" değil ld.so.conf.d / *. Conf "içerir.
timss

79

Mezarcı şapkamı takıyorum ...

Bunu ele almanın en iyi yolu derleme zamanında. Yine de tek ayar öneki olduğunuz için, yürütülebilir dosyaya paylaşılan kitaplıklarını nerede bulacağınızı da açıkça söyleyebilirsiniz. OpenSSL ve diğer yazılım paketlerinin aksine, Python size alternatif kütüphane yollarını işlemek için güzel bir yapılandırma talimatı vermez (herkesin bildiği kök değildir ...) En basit durumda ihtiyacınız olan tek şey aşağıdakilerdir:

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

Veya linux olmayan sürümü tercih ederseniz:

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

" rpath" Bayrağı python'a belirli bir yolda ihtiyaç duyduğu çalışma zamanı kütüphanelerine sahip olduğunu söyler. Standart sistem konumlarından farklı bir konuma yüklenen bağımlılıkları ele almak için bu fikri daha ileriye götürebilirsiniz. Örneğin, kök erişimim olmadığından ve neredeyse tamamen bağımsız Python yüklemeleri yapmam gerektiğinden sistemlerimde, yapılandırma satırım şöyle görünüyor:

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

Bu durumda ben kütüphaneleri derleme olduğumu piton kullandığı (gibi ffi, readlinebir içine, vs) extlibpiton dizin ağacının kendi içinde dizine. Bu şekilde ben python - $ {PYTHON_VERSION} dizini katran ve herhangi bir yere inmek ve "çalışacak" libcveya çakışmazsa) çalışacaktır libm. Bu, aynı kutuda birden fazla Python sürümünü çalıştırmaya çalışırken de yardımcı olur, çünkü LD_LIBRARY_PATHPython kütüphanesinin yanlış sürümünü almaya devam etmeniz veya endişelenmenize gerek yoktur.

Düzenleme: Ortam değişkenini önek olarak kullandığınız şeye ayarlamazsanız vePYTHONPATH bazı modülleri derleyemezseniz, örneğin yukarıdaki örneği genişletmek için, yukarıda PYTHONPATHkullanılan öneki ayarlayın ile örnek export PYTHONPATH=/apps/python-${PYTHON_VERSION}...


//, Aradığım şey gibi görünüyor. Nereden daha fazla yollarını öğrenebilirsiniz "python-versiyon dizini katran ve hiçbir yerde karaya ve 'iş' (Eğer libc veya libm çakışması olmayacak yok)" ? Bundan ayrı bir stackoverflow.com sorusu sormaya değer olduğunu düşünüyor musunuz?
Nathan Basanese

//, Ayrıca, nasıl ayarlanmalı $PYTHON_VERSION?
Nathan Basanese

//, $PYTHON_VERSIONyapılandırdıktan sonra ayarladım . Bununla birlikte, $PYTHON_VERSIONsetle bile derleyici şikayet ediyorPython 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

//, Bu makekomutta ve diğer kurulum komutlarında herhangi bir değişiklik yapılmasını gerektiriyor mu ?
Nathan Basanese

1
@NathanBasanese eksik bz2, küfürler, gdbm, lzma, vb /apps/python-${PYTHON_VERSION}/extlibdurumunda kitaplıklarının ve başlıklarının Python yapmak için uygun bir konumda olmasını sağlamak için bir önekle her birini derlemeniz gerekir . Sistem düzeyindeki paketlere gelince, muhtemelen bunları sizin için önceden yüklemek için kök bir kullanıcıya güvenmek zorunda kalacaksınız. Ya da derlenip extlib
inebilecek

21

Aynı sorunu yaşadım ve bu şekilde çözdüm:

Eğer libpython'un nerede olduğunu biliyorsanız /usr/local/lib/libpython2.7.so.1.0, sizin durumunuzda olacağını sanıyordum , sadece sembolik bir bağlantı oluşturabilirsiniz:

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

Sonra lddtekrar koşmayı deneyin ve işe yarayıp yaramadığını görün.


6

Centios 7 üzerine Python 3.5'i Software Collections tarafından yükledim . Her şey kendi başına iyi çalıştı, ancak basit bir CGI betiği çalıştırmayı denediğimde bu soruda belirtilen paylaşılan kütüphane hatasını gördüm:

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

Tüm kullanıcılar için çalışan, .profile veya .bashrc dosyalarına dışa aktarma ifadeleri eklenmesini engelleyen sistem çapında kalıcı bir çözüm istedim. Red Hat çözümleri sayfasına dayanan tek satırlık bir çözüm var . Dikkat çeken yorum için teşekkürler:

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

Yeniden başlattıktan sonra her şey iyi durumda, ancak bazen web sunucum hala şikayet ediyor. Hem kabuk hem de sunucu için her zaman çalışan ve daha genel olan başka bir yaklaşım var. Buradaki çözümü gördüm ve daha sonra buradaki yanıtlardan birinde de belirtildiğini fark ettim! Her neyse, CentOS 7'de, adımlar şunlardır:

 vim /etc/ld.so.conf

Hangi benim makinede vardı:

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

Bu yüzden yeni bir dosya oluşturdum:

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

Ve ekledi:

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

Önbelleği manuel olarak yeniden oluşturmak için:

sudo ldconfig

İşte bu, scriptler iyi çalışıyor!

Bu, yeniden başlatmalarda çalışmayan geçici bir çözümdü:

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

-V (ayrıntılı) seçeneği sadece neler olduğunu görmekti. Bunu yaptığını gördüm: / 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

Bu hata ortadan kalktı. Bu arada, chownbir izin hatası kurtulmak için apache kullanıcı vardı .

Kütüphane dizinini bulmak için find komutunu kullandığımı unutmayın . Ayrıca şunları da yapabilirsiniz:

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

Hangi benim VM döner:

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

Yukarıda gösterildiği gibi ldconfig dosyasına vermem gereken yol budur.


1
/Etc/profile.d adresine giderek #!/bin/bashve source scl_source enable rh-python35içinde aşağıdakileri içeren bir dosya oluşturarak kendinize biraz sorun yaşayabilirsiniz: ve içinde. access.redhat.com/solutions/527703
Doug

2

Solaris 11 ile ilgili

LD_LIBRARY_PATH_64Sylink'i python kütüphanelerine çözümlemek için kullanın .

Benim durumumda python3.6 LD_LIBRARY_PATHişe yaramadı ama işe LD_LIBRARY_PATH_64yaradı.

Bu yardımcı olur umarım.
Saygılarımızla


1

Bu benim için çalıştı ...

$ sudo apt-get install python2.7-dev

Merhaba bu doğru çözüm değil, çünkü bundan sonra, özel yapı python ikili sizin apt-get yüklediğiniz bir .so kullanıyor. Bu, aynı sürüme sahipken sorunlara neden olabilir veya python kaynak kodunu değiştirdiyseniz, çaba sarf edilmeyecektir.
Azusa Nakano

0

Şu komutu kullanarak yükledim:

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

make

Şimdi, kök kullanıcı olarak:

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

Sonra python yürütmeye çalıştım ve hatayı aldım:

/ usr / local / bin / python: paylaşılan kitaplıkları yüklerken hata: libpython2.7.so.1.0: paylaşılan nesne dosyası açılamıyor: Böyle bir dosya veya dizin yok

Sonra kök kullanıcıdan çıkış yaptım ve yine Python'u çalıştırmayı denedim ve başarıyla çalıştı.


0

Tek gereken libpython [3 veya 2] dev dosyalarının kurulumudur.


-1

sadece python-lib'i yükleyin. (Python27-llb). Libpython2.7.so1.0 yükleyecektir. Hiçbir şeyi manuel olarak ayarlamamız gerekmez.


4
//, Ve eğer CEntOS 6.3? Bu, orada işe yaramaz ve genellikle insanlar Python'u, sistemin Python'un garip bir sürümü, kırık, güvenilmez veya genel sisteme dokunmamaya yönelik başka bir istek olduğu bir durumla başa çıkmak için derler.
Nathan Basanese
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.