Warum kann Python keine freigegebenen Objekte finden, die sich in Verzeichnissen in sys.path befinden?
Ich versuche, import 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
Nun libcurl.so.4 ist in /usr/local/lib. Wie Sie sehen können, ist dies in der sys.Pfad:
$ 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']
Jede Hilfe wird sehr geschätzt.
InformationsquelleAutor der Frage | 2009-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
sys.path
ist nur gesucht für Python-Module. Für dynamisch gelinkte Bibliotheken, die Wege gesucht werden müssen, inLD_LIBRARY_PATH
. Prüfen Sie, ob IhrLD_LIBRARY_PATH
umfasst/usr/local/lib
und wenn es nicht, fügen Sie es und versuchen Sie es erneut.Einige weitere Informationen (Quelle):
Update: zu setzen
LD_LIBRARY_PATH
verwenden Sie eine der folgenden, im Idealfall in Ihrem~/.bashrc
oder gleichwertig Datei:
oder
Verwenden Sie die erste form, wenn es leer ist (entspricht dem leeren string, oder gar nicht vorhanden), und die zweite form ist, wenn es nicht. Beachten Sie die Verwendung von export.
InformationsquelleAutor der Antwort Vinay Sajip
Sicherzustellen, dass Ihre libcurl.so-Modul in der system-library-path, das ist deutliche und separaten von der python-Bibliotheks-Pfad.
Einen "quick-fix" fügen Sie diesen Pfad in einen LD_LIBRARY_PATH-variable. Jedoch, die Einstellung, die systemweite (oder auch account-weit) ist eine SCHLECHTE IDEE, wie es möglich ist, legen Sie es in einer Weise, dass einige Programme eine Bibliothek sollte es nicht, oder, noch schlimmer, öffnen Sicherheitslücken.
Wenn Ihr "lokal installierte Bibliotheken" sind installiert, zum Beispiel /usr/local/lib, fügen Sie dieses Verzeichnis zu /etc/ld.so.conf (es ist eine text-Datei) und führen Sie "ldconfig"
Der Befehl wird ausgeführt, ein Datenträgerzwischenspeicherung Dienstprogramm, aber auch alle notwendigen "symbolischen links" erforderlich für die loader-system, um zu funktionieren. Es ist verwunderlich, dass der "make install" für libcurl nicht tun dies bereits, aber es ist möglich, könnte es nicht, wenn /usr/local/lib nicht in /etc/ld.so.conf schon.
PS: es ist möglich, dass Ihre /etc/ld.so.conf enthält nichts aber "enthalten ld.so.conf.d/*.conf". Sie können noch ein Verzeichnis-Pfad, nachdem Sie, oder erstellen Sie einfach eine neue Datei in dem Verzeichnis, in es aufgenommen wird. Nicht zu vergessen, "ldconfig" nach.
Vorsichtig sein. Immer diese falsch, kann es vermasseln Ihrem system.
Außerdem: stellen Sie sicher, dass Ihre python-Modul ist kompiliert, DIE version von libcurl. Wenn Sie nur kopiert einige Dateien über von einem anderen system, das nicht immer funktioniert. Wenn Sie Zweifel haben, kompilieren Sie Ihre Module auf dem system, das Sie wollen, führen Sie Sie auf.
InformationsquelleAutor der Antwort Ch'marr
Können Sie auch festlegen, LD_RUN_PATH auf " /usr/local/lib in Ihrem Benutzer-Umgebung beim kompilieren pycurl in den ersten Platz. Dies wird einbetten /usr/local/lib in der RPATH-Attribut des C-Erweiterungsmodul .also so, dass es automatisch weiß, wo Sie finden die Bibliothek zu laufen, ohne Zeit zu haben LD_LIBRARY_PATH zur Laufzeit festgelegt.
InformationsquelleAutor der Antwort Graham Dumpleton
Hatte das exakt gleiche Problem. Ich installierte curl 7.19 /opt/curl/, um sicherzustellen, dass ich nicht auf aktuelle curl auf unseren Produktionsservern.
Sobald ich verbunden libcurl.so.4 nach /usr/lib:
sudo ln -s /opt/curl/lib/libcurl.so /usr/lib/libcurl.so.4
Ich habe immer noch den gleichen Fehler! Durf.
Aber ldconfig aufzurufen stellen Sie die Verknüpfung für mich und das hat geklappt. Keine Notwendigkeit, um den LD_RUN_PATH oder LD_LIBRARY_PATH überhaupt. Nur benötigt zum ausführen von ldconfig.
InformationsquelleAutor der Antwort Matt
Als Ergänzung zu oben genannten Antworten - ich bin nur stoßen ein ähnliches problem, und arbeiten völlig von den standardmäßig installierten python.
Wenn ich nenne das Beispiel der shared-object-Bibliothek, die ich bin auf der Suche nach mit
LD_LIBRARY_PATH
bekomme ich so etwas wie dieses:Insbesondere, dass Sie nicht einmal beschweren sich über die import - es klagt der Quell-Datei!
Aber wenn ich erzwingen das Objekt mit
LD_PRELOAD
:... Bekomme ich sofort eine aussagekräftige Fehlermeldung über fehlende Abhängigkeit!
Dachte nur, ich würde notieren Sie diese hier unten - prost!
InformationsquelleAutor der Antwort sdaau
Benutze ich
python setup.py build_ext -R/usr/local/lib -I/usr/local/include/libcalg-1.0
und zusammengestellt .also die Datei ist unter den Ordner.geben Sie
python setup.py --help build_ext
zu sehen, die Erklärung von -R und -ichInformationsquelleAutor der Antwort ScutterKey