Ich versuche zu importieren 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
Jetzt libcurl.so.4
ist in /usr/local/lib
. Wie Sie sehen können, ist dies in 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']
Jede Hilfe wird sehr geschätzt.
LD_LIBRARY_PATH
richtig eingestellt haben (ich dachte, Ihr Kommentar hat einen fehlenden Doppelpunkt).Antworten:
sys.path
wird nur nach Python-Modulen gesucht. Bei dynamisch verknüpften Bibliotheken müssen sich die gesuchten Pfade in befindenLD_LIBRARY_PATH
. Überprüfen Sie, ob IhreLD_LIBRARY_PATH
Includes enthalten sind/usr/local/lib
, und fügen Sie sie erneut hinzu, falls dies nicht der Fall ist.Weitere Informationen ( Quelle ):
Update:
LD_LIBRARY_PATH
Verwenden Sie zum Festlegen eine der folgenden Optionen, idealerweise in Ihrer~/.bashrc
oder einer gleichwertigen Datei:oder
Verwenden Sie das erste Formular, wenn es leer ist (entspricht der leeren Zeichenfolge oder ist überhaupt nicht vorhanden), und das zweite Formular, wenn es nicht vorhanden ist. Beachten Sie die Verwendung des Exports .
quelle
Stellen Sie sicher, dass sich Ihr libcurl.so-Modul im Systembibliothekspfad befindet, der sich vom Python-Bibliothekspfad unterscheidet.
Eine "schnelle Lösung" besteht darin, diesen Pfad einer LD_LIBRARY_PATH-Variablen hinzuzufügen. Das systemweite (oder sogar kontoweite) Einstellen ist jedoch eine SCHLECHTE IDEE, da es möglich ist, es so einzustellen, dass einige Programme eine Bibliothek finden, die keine oder noch schlimmer Sicherheitslücken öffnen sollte.
Wenn Ihre "lokal installierten Bibliotheken" beispielsweise in / usr / local / lib installiert sind, fügen Sie dieses Verzeichnis zu /etc/ld.so.conf hinzu (es ist eine Textdatei) und führen Sie "ldconfig" aus.
Der Befehl führt ein Caching-Dienstprogramm aus, erstellt jedoch auch alle erforderlichen "symbolischen Links", die für die Funktion des Loader-Systems erforderlich sind. Es ist überraschend, dass die "make install" für libcurl dies nicht bereits getan hat, aber es ist möglich, dass dies nicht möglich ist, wenn / usr / local / lib nicht bereits in /etc/ld.so.conf vorhanden ist.
PS: Möglicherweise enthält Ihre /etc/ld.so.conf nur "include ld.so.conf.d / *. Conf". Sie können danach noch einen Verzeichnispfad hinzufügen oder einfach eine neue Datei in dem Verzeichnis erstellen, aus dem sie aufgenommen wird. Vergessen Sie nicht, danach "ldconfig" auszuführen.
Achtung. Wenn Sie dies falsch verstehen, kann dies Ihr System durcheinander bringen.
Zusätzlich: Stellen Sie sicher, dass Ihr Python-Modul für DIESE Version von libcurl kompiliert ist. Wenn Sie nur einige Dateien von einem anderen System kopiert haben, funktioniert dies nicht immer. Kompilieren Sie im Zweifelsfall Ihre Module auf dem System, auf dem Sie sie ausführen möchten.
quelle
Sie können LD_RUN_PATH auch in Ihrer Benutzerumgebung auf / usr / local / lib setzen, wenn Sie pycurl zuerst kompilieren. Dadurch wird / usr / local / lib in das RPATH-Attribut des C-Erweiterungsmoduls eingebettet, sodass automatisch erkannt wird, wo sich die Bibliothek zur Laufzeit befindet, ohne dass LD_LIBRARY_PATH zur Laufzeit festgelegt werden muss.
quelle
python setup.py build_ext --rpath=/usr/local/lib
beim ErstellenHatte genau das gleiche Problem. Ich habe curl 7.19 in / opt / curl / installiert, um sicherzustellen, dass das aktuelle Curl auf unseren Produktionsservern nicht beeinträchtigt wird. Sobald ich libcurl.so.4 mit / usr / lib verknüpft habe:
sudo ln -s /opt/curl/lib/libcurl.so /usr/lib/libcurl.so.4
Ich habe immer noch den gleichen Fehler! Durf.
Aber mit ldconfig wird die Verknüpfung für mich hergestellt und das hat funktioniert. LD_RUN_PATH oder LD_LIBRARY_PATH müssen überhaupt nicht festgelegt werden. Muss nur ldconfig ausführen.
quelle
LD_LIBRARY_PATH
oben beschriebene Umgebungsvariablenmethode verwenden. Wenn Sie es nicht in Ihrer festlegen möchten~/.bashrc
(das Hinzufügen dieser Einstellung ist keine gute Idee, IMO), können Sie ein Shell-Skript schreiben, das diese Variable festlegt, dann Python ausführt und dieses Skript aufruft.Als Ergänzung zu den obigen Antworten stoße ich nur auf ein ähnliches Problem und arbeite vollständig mit der standardmäßig installierten Python.
Wenn ich das Beispiel der gemeinsam genutzten Objektbibliothek aufrufe, mit der ich suche
LD_LIBRARY_PATH
, erhalte ich ungefähr Folgendes:Insbesondere beschwert es sich nicht einmal über den Import - es beschwert sich über die Quelldatei!
Aber wenn ich das Laden des Objekts erzwinge, indem ich
LD_PRELOAD
:... Ich erhalte sofort eine aussagekräftigere Fehlermeldung - über eine fehlende Abhängigkeit!
Ich dachte nur, ich würde das hier unten notieren - Prost!
quelle
Ich benutze
python setup.py build_ext -R/usr/local/lib -I/usr/local/include/libcalg-1.0
und die kompilierte .so-Datei befindet sich unter dem Build-Ordner. Sie können eingebenpython setup.py --help build_ext
, um die Erklärungen von -R und -I anzuzeigenquelle
Für mich funktioniert hier die Verwendung eines Versionsmanagers wie pyenv . Ich empfehle dringend, Ihre Projektumgebungen und Paketversionen gut zu verwalten und von denen des trennen.
Ich hatte den gleichen Fehler nach einem Betriebssystem-Update, konnte aber leicht mit
pyenv install 3.7-dev
(der von mir verwendeten Version) behoben werden .quelle