Die ausführbare Python-Datei findet keine gemeinsam genutzte libpython-Bibliothek

143

Ich installiere Python 2.7 unter CentOS 5. Ich habe Python wie folgt erstellt und installiert

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

Wenn ich versuche, / usr / local / bin / python auszuführen, wird diese Fehlermeldung angezeigt

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

Wenn ich ldd unter / usr / local / bin / python ausführe, bekomme ich

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)

Wie sage ich Python, wo Libpython zu finden ist?

ohne
quelle

Antworten:

203

Versuche Folgendes:

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

Ersetzen Sie ihn /usr/local/libdurch den Ordner, in dem Sie ihn installiert haben, libpython2.7.so.1.0wenn er nicht vorhanden ist /usr/local/lib.

Wenn dies funktioniert und Sie die Änderungen dauerhaft vornehmen möchten, haben Sie zwei Möglichkeiten:

  1. Hinzufügen export LD_LIBRARY_PATH=/usr/local/libzu Ihrem .profilein Ihrem Home-Verzeichnis (dies funktioniert nur, wenn Sie eine Shell verwenden, die diese Datei lädt, wenn eine neue Shell-Instanz gestartet wird). Diese Einstellung wirkt sich nur auf Ihren Benutzer aus.

  2. In /usr/local/libzu /etc/ld.so.confund laufen ldconfig. Dies ist natürlich eine systemweite Einstellung.

Tamás
quelle
Gibt es eine Möglichkeit, es so zu exportieren, dass es mit Eclipse funktioniert? Ich habe es meinem .profile hinzugefügt, aber dann kann Eclipse gdb nicht starten. (Hinweis: Das Hinzufügen zu ld.so.conf funktioniert jedoch)
Setheron
Also habe ich überprüft, mit welchen Umgebungsvariablen Eclipse ausgeführt wird und ob es das richtige LD_LIBRARY_PATH hat. Ich glaube, dass es beim Start von GDB keine Shell verwendet und daher keine Umgebungsvariablen erhält! Das Einstellen der libpython in der Debug-Konfiguration hat auch nicht geholfen, da dies nur für den Fall ist, dass gdb tatsächlich geladen wird (aber ich brauche die lib, damit gdb selbst geladen wird)
Setheron
1
Können Sie die Anwendung erfolgreich debuggen, wenn Sie gdbüber die Befehlszeile ausgeführt werden und LD_LIBRARY_PATH im Terminal ordnungsgemäß eingerichtet ist? Wenn nicht, müssen Sie wahrscheinlich LD_LIBRARY_PATH in Ihrer .gdbinitDatei einrichten . Siehe diese Antwort für weitere Informationen: stackoverflow.com/a/7041845/156771
Tamás
Ich benötige LD_LIBRARY_PATH zum Starten von gdb (Python libs), nicht zum eigentlichen Debuggen meiner Anwendung. Bisher konnte ich es nur beheben, indem ich es in ldconfig einstellte. Ich kann die Anwendung über die CLI debuggen, da sie LD_LIBRARY_PATH jedoch aus meiner ZSHRC-Datei übernimmt.
Setheron
10
Nur ein Hinweis für alle, die dies versuchen: Es ist nur "/ usr / local / lib" und kein Start-Include wie das Original "include ld.so.conf.d / *. Conf".
Timss
79

Ich setze meinen Totengräberhut auf ...

Der beste Weg, dies zu beheben, ist zur Kompilierungszeit. Da Sie ohnehin das einzige Einstellungspräfix sind, können Sie der ausführbaren Datei auch explizit mitteilen, wo sich die gemeinsam genutzten Bibliotheken befinden. Im Gegensatz zu OpenSSL und anderen Softwarepaketen bietet Python keine nützlichen Konfigurationsanweisungen für die Verarbeitung alternativer Bibliothekspfade (nicht jeder ist Root, den Sie kennen ...). Im einfachsten Fall benötigen Sie lediglich Folgendes:

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

Oder wenn Sie die Nicht-Linux-Version bevorzugen:

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

Das " rpath" -Flag teilt Python mit, dass es Laufzeitbibliotheken hat, die es in diesem bestimmten Pfad benötigt. Sie können diese Idee weiterentwickeln, um Abhängigkeiten zu behandeln, die an einem anderen Speicherort als den Standardsystemstandorten installiert sind. Auf meinen Systemen sieht meine Konfigurationszeile beispielsweise folgendermaßen aus, da ich keinen Root-Zugriff habe und fast vollständig eigenständige Python-Installationen durchführen muss:

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

In diesem Fall bin ich Kompilieren die Bibliotheken , dass Python verwendet (wie ffi, readlineusw.) in ein extlibVerzeichnis innerhalb des Python - Verzeichnisbaum selbst. So kann ich die Python Teer kann - $ {PYTHON_VERSION} Verzeichnis und landen sie überall , und es wird „Arbeit“ (sofern Sie nicht den Weg laufen libcoder libmKonflikte). Dies ist auch hilfreich, wenn Sie versuchen, mehrere Versionen von Python auf derselben Box auszuführen, da Sie nicht ständig Änderungen vornehmen LD_LIBRARY_PATHoder sich Sorgen machen müssen, die falsche Version der Python-Bibliothek zu finden.

Bearbeiten: Vergessen zu erwähnen, dass sich die Kompilierung beschwert, wenn Sie die PYTHONPATHUmgebungsvariable nicht auf das setzen , was Sie als Präfix verwenden, und einige Module nicht kompilieren können, z. B. um das obige Beispiel zu erweitern, setzen Sie das PYTHONPATHauf das oben verwendete Präfix Beispiel mit export PYTHONPATH=/apps/python-${PYTHON_VERSION}...

Foosh
quelle
//, Das sieht so aus, wie ich es suche. Wo kann ich mehr darüber erfahren, wie man "das Python-Versionsverzeichnis tariert und irgendwo landet und es" funktioniert "(vorausgesetzt, Sie stoßen nicht auf libc- oder libm-Konflikte)" ? Denken Sie, dass es sich lohnt, daraus eine separate Frage zu stackoverflow.com zu machen?
Nathan Basanese
//, Wie soll man auch setzen $PYTHON_VERSION?
Nathan Basanese
//, ich setze $PYTHON_VERSIONnach der Konfiguration. $PYTHON_VERSIONPython build finished successfully! The necessary bits to build these optional modules were not found: _bz2 _curses _curses_panel _gdbm _lzma _sqlite3 _tkinter readline
Trotz
//, Erfordert dies Änderungen am makeBefehl und anderen Installationsbefehlen?
Nathan Basanese
1
@NathanBasanese Im Fall von fehlendem bz2, curses, gdbm, lzma usw. müssten Sie jedes dieser zuerst mit dem Präfix von kompilieren, /apps/python-${PYTHON_VERSION}/extlibum sicherzustellen, dass sich ihre Bibliotheken und Header an der richtigen Stelle befinden, damit der Python- Erstellungsprozess sie findet. Bei Paketen auf Systemebene müssen Sie sich wahrscheinlich darauf verlassen, dass ein Root-Benutzer diese Pakete zuvor für Sie installiert. Oder eine Alternative finden, die kompiliert und imextlib
Foosh
21

Ich hatte das gleiche Problem und habe es folgendermaßen gelöst:

Wenn Sie wissen, wo sich libpython befindet, können Sie /usr/local/lib/libpython2.7.so.1.0in Ihrem Fall einfach einen symbolischen Link dazu erstellen:

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

Versuchen Sie dann ldderneut zu laufen und prüfen Sie, ob es funktioniert hat.

Omer Dagan
quelle
6

Ich habe Python 3.5 von Software Collections auf CentOS 7 minimal installiert . Es hat alles gut funktioniert, aber ich habe den in dieser Frage erwähnten Fehler in der gemeinsam genutzten Bibliothek gesehen, als ich versucht habe, ein einfaches CGI-Skript auszuführen:

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

Ich wollte eine systemweite dauerhafte Lösung, die für alle Benutzer funktioniert, sodass das Hinzufügen von Exportanweisungen zu .profile- oder .bashrc-Dateien ausgeschlossen ist. Es gibt eine einzeilige Lösung, die auf der Red Hat-Lösungsseite basiert . Vielen Dank für den Kommentar, der darauf hinweist:

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

Nach einem Neustart ist alles gut in der Shell, aber manchmal beschwert sich mein Webserver immer noch. Es gibt einen anderen Ansatz, der sowohl für die Shell als auch für den Server immer funktioniert hat und allgemeiner ist. Ich habe die Lösung hier gesehen und dann festgestellt, dass sie auch hier in einer der Antworten erwähnt wird! Unter CentOS 7 sind dies die folgenden Schritte:

 vim /etc/ld.so.conf

Was auf meiner Maschine gerade hatte:

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

Also habe ich eine neue Datei erstellt:

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

Und hinzugefügt:

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

Und um den Cache manuell neu zu erstellen:

sudo ldconfig

Das war's, Skripte funktionieren gut!

Dies war eine vorübergehende Lösung, die bei Neustarts nicht funktioniert hat:

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

Die Option -v (ausführlich) war nur, um zu sehen, was los war. Ich habe gesehen, dass es funktioniert: / 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

Dieser besondere Fehler ging weg. Übrigens musste ich chownden Benutzer apachen, um danach einen Berechtigungsfehler zu beseitigen.

Beachten Sie, dass ich find verwendet habe , um das Verzeichnis für die Bibliothek zu finden. Sie könnten auch tun:

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

Was auf meiner VM zurückkehrt:

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

Welches ist der Pfad, den ich zu ldconfig geben muss, wie oben gezeigt.

Nagev
quelle
1
Sie hätten sich Ärger ersparen können, indem Sie zu /etc/profile.d gegangen sind und eine Datei mit den folgenden Angaben erstellt haben: #!/bin/bashund source scl_source enable rh-python35darin. access.redhat.com/solutions/527703
Doug
2

Unter Solaris 11

Verwenden Sie LD_LIBRARY_PATH_64diese Option, um den Symlink zu Python-Bibliotheken aufzulösen.

In meinem Fall für Python3.6 LD_LIBRARY_PATHhat es nicht funktioniert, aber es hat LD_LIBRARY_PATH_64funktioniert.

Hoffe das hilft.
Grüße

basy
quelle
1

Das hat bei mir funktioniert ...

$ sudo apt-get install python2.7-dev
Kyle Anderson
quelle
Hallo, dies ist nicht die richtige Lösung, da Ihre benutzerdefinierte Python-Binärdatei danach die .so-Datei verwendet, die Sie von apt-get installiert haben. Dies kann zu Problemen führen, wenn sie dieselbe Version haben. Wenn Sie den Python-Quellcode geändert haben, sind keine Anstrengungen erforderlich.
Azusa Nakano
0

Ich habe mit dem Befehl installiert:

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

make

Nun, als Root-Benutzer:

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

Dann habe ich versucht, Python auszuführen und bekam den Fehler:

/ usr / local / bin / python: Fehler beim Laden von gemeinsam genutzten Bibliotheken: libpython2.7.so.1.0: Datei für gemeinsam genutzte Objekte kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis

Dann habe ich mich vom Root-Benutzer abgemeldet und erneut versucht, Python auszuführen, und es hat erfolgreich funktioniert.

Pankaj
quelle
0

Alles was es braucht ist die Installation der Installation von libpython [3 oder 2] Dev-Dateien.


quelle
-1

Installieren Sie einfach Python-Lib. (python27-lib). Es wird libpython2.7.so1.0 installiert. Wir müssen nichts manuell einstellen.

Chintan-p-Bhatt
quelle
4
//, Und wenn Sie beispielsweise CEntOS 6.3 verwenden? Dies funktioniert dort nicht und normalerweise kompilieren die Leute Python, um einen Fall zu behandeln, in dem das System Python eine seltsame Version ist, kaputt, unzuverlässig oder ein anderer Wunsch, das Gesamtsystem nicht zu berühren.
Nathan Basanese