Hi @all,
gibt es eine Möglichkeit den Library Path während der Scriptausführung zu ändern (Linux System).
Habe Python über nen Webserver laufen und er findet eine *.so nicht, weil der Pfad zur besagten Datei nicht in LD_LIBRARY_PATH steht. Manuell hinzufügen kann ich es auch nicht, da ich keinen Zugang zu dem Server habe.
Somit muss ich während der Laufzeit irgendwie den Pfad anpassen können, damit die Datei gefunden wird. Bzw beim laden des Moduls den zugehörigen Libpath angeben können...
Gibt es da irgendeine Lösung ? (sys.path.append geht nicht...)
Library Path während Laufzeit ändern ?
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi smezger!smezger hat geschrieben:Gibt es da irgendeine Lösung ? (sys.path.append geht nicht...)
Willkommen im Python-Forum!
``sys.path.append()`` ist genau der Tipp, den ich dir jetzt geben wollte. Das geht bei mir immer.
Kann es sein, dass der Benutzer unter dem der Webserver ausgeführt wir, keine Berechtigung für diese Datei hat?
Siehe: http://www.python-forum.de/topic-7539.html
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Hoi und willkommen im Forum!
Aber Moment mal - LD_LIBRARY_PATH und PYTHONPATH (worauf sys.path.append "wirkt") sind zwei verschiedene Paar Schuhe.
Versuche mal herauszufinden, ob der Pfad tatsächlich nicht im LD_LIBRARY_PATH ist. (Falls Du Anfänger bist, das geht mit:, wobei ich unterstelle, daß Du mit BASH arbeitest.)
Ansonsten kannst Du so Deinen Pfad dem LD_LIBRARY_PATH hinzufügen:
Und diese Zeile kannst Du auch in Dein .bashrc eintragen, falls Du diese .so-Datei regelmäßig einbinden mußt. Die Rechte dafür sollten nicht das Problem sein.
Oder bin ich jetzt völlig auf dem Holzweg und habe da was falsch verstanden?
Gruß,
Christian
edit: Anführungsstriche für das "wirkt", weil sys.path.append natürlich nicht PYTHONPATH verändert, sondern die Pfadvariable im laufend Interpreter erweitert.
Aber Moment mal - LD_LIBRARY_PATH und PYTHONPATH (worauf sys.path.append "wirkt") sind zwei verschiedene Paar Schuhe.
Versuche mal herauszufinden, ob der Pfad tatsächlich nicht im LD_LIBRARY_PATH ist. (Falls Du Anfänger bist, das geht mit:
Code: Alles auswählen
echo $LD_LIBRARY_PATH
Ansonsten kannst Du so Deinen Pfad dem LD_LIBRARY_PATH hinzufügen:
Code: Alles auswählen
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}/:DEINVERZEICHNIS/"
Oder bin ich jetzt völlig auf dem Holzweg und habe da was falsch verstanden?
Gruß,
Christian
edit: Anführungsstriche für das "wirkt", weil sys.path.append natürlich nicht PYTHONPATH verändert, sondern die Pfadvariable im laufend Interpreter erweitert.
Zuletzt geändert von CM am Montag 23. Oktober 2006, 13:39, insgesamt 1-mal geändert.
@gerold
Hm, also Berechtigung müsste er haben. Fehlermeldung ist ja dass er sie nicht findet und nicht dass er nicht Zugreifen darf. Lokal bei mir auf dem Linux-PC kommt die Fehlermeldung auch, aber nach der Pfadanpassung im LD_LIBRARY_PATH geht alles wunderbar. Das ganze sollte jetzt halt auch auf dem Server im Internet laufen wo ich keinen Shell Zugang habe...
@CM
Arbeite normalerweise mit der Shell csh, aber auf diesem Server habe ich leider keine Shell (kein SSH zugang oder ähnliches).
Wenn der Sys.path nur den PYTHONPATH ändert ist ads natürlich der falsche Weg, da hast recht. Mit welcheer Funktion kann ich dann den LD_LIBRARY_PATH ändern ? (nochmal: kein Zugang zum Server)
Hm, also Berechtigung müsste er haben. Fehlermeldung ist ja dass er sie nicht findet und nicht dass er nicht Zugreifen darf. Lokal bei mir auf dem Linux-PC kommt die Fehlermeldung auch, aber nach der Pfadanpassung im LD_LIBRARY_PATH geht alles wunderbar. Das ganze sollte jetzt halt auch auf dem Server im Internet laufen wo ich keinen Shell Zugang habe...
@CM
Arbeite normalerweise mit der Shell csh, aber auf diesem Server habe ich leider keine Shell (kein SSH zugang oder ähnliches).
Wenn der Sys.path nur den PYTHONPATH ändert ist ads natürlich der falsche Weg, da hast recht. Mit welcheer Funktion kann ich dann den LD_LIBRARY_PATH ändern ? (nochmal: kein Zugang zum Server)
Wie speicherst Du denn Deine Dateien auf dem Server und schaust Dir an was drauf ist? FTP oder eine FTP-Variante? Wirklich noch nicht mal SSH-Zugriff?
Gruß,
Christian
Gruß,
Christian
Die Umgebungsvariablen werden im Modul `os` als Abbildung unter dem Namen `environ` zur Verfügung gestellt. Da solltest Du das auch ändern können.smezger hat geschrieben: Mit welcheer Funktion kann ich dann den LD_LIBRARY_PATH ändern ? (nochmal: kein Zugang zum Server)
Schade, jetzt hab ich schon gedacht das Problem ist gelöst...
os.environ["LD_LIBRARY_PATH"] = '/usr/home/www/web20/htdocs'
Mit dem Befehl kann man den Pfad ändern. Aber der import tut immer noch nicht. Er findet die .so in meinem Verzeichniss einfach nicht. Wenn ich mit export LD_LIBRARY_PATH das auf meinem Testrechner Eintrage (genau gleicher Pfad) dann findet er es.
Also wird der Import wohl von einem anderen Python-Prozess gemacht wie der wo das Script ausführt. Wird ja mit der obigen Methode nur für den einen Prozess festgelegt und nich global für alle wie mit "export" unter Bash...
Lade die Dateien auf den Webserver mit FTP hoch, ja. Weder Telnet noch SSH noch sonst was wo man Befehle eintippen kann... Normaler Webspace ohne Extras halt...
os.environ["LD_LIBRARY_PATH"] = '/usr/home/www/web20/htdocs'
Mit dem Befehl kann man den Pfad ändern. Aber der import tut immer noch nicht. Er findet die .so in meinem Verzeichniss einfach nicht. Wenn ich mit export LD_LIBRARY_PATH das auf meinem Testrechner Eintrage (genau gleicher Pfad) dann findet er es.
Also wird der Import wohl von einem anderen Python-Prozess gemacht wie der wo das Script ausführt. Wird ja mit der obigen Methode nur für den einen Prozess festgelegt und nich global für alle wie mit "export" unter Bash...
Lade die Dateien auf den Webserver mit FTP hoch, ja. Weder Telnet noch SSH noch sonst was wo man Befehle eintippen kann... Normaler Webspace ohne Extras halt...
Wenn selbst diese Idee BlackJack nicht funktioniert - danke für die Erinnerung - dann: Gibt es vielleicht eine Fehlermeldung, die Du uns zeigen kannst? Vielleicht einen Eintrag in eine Log-Datei?
Gruß,
Christian
Gruß,
Christian
Traceback (most recent call last):
File "test.cgi", line 16, in <module>
import cx_Oracle
ImportError: libclntsh.so.9.0: cannot open shared object file: No such file or directory
Ich kenne ja das Problem... Lassen wir mal den Webspace weg und nehmen nur meinen Testrechner Zuhause.
Wenn ich den Library Path global mit export auf usr/home/www/web20/htdocs ändere tut alles perfekt. Wenn ich es lokal im Script mache mit os.environ["LD_LIBRARY_PATH"] dann tut es nicht.
Und da ich auf dem Webspace kein SSH Zugriff habe, muss ich es über das Script irgendwie realisieren... Die Frage ist nur wie...
File "test.cgi", line 16, in <module>
import cx_Oracle
ImportError: libclntsh.so.9.0: cannot open shared object file: No such file or directory
Ich kenne ja das Problem... Lassen wir mal den Webspace weg und nehmen nur meinen Testrechner Zuhause.
Wenn ich den Library Path global mit export auf usr/home/www/web20/htdocs ändere tut alles perfekt. Wenn ich es lokal im Script mache mit os.environ["LD_LIBRARY_PATH"] dann tut es nicht.
Und da ich auf dem Webspace kein SSH Zugriff habe, muss ich es über das Script irgendwie realisieren... Die Frage ist nur wie...
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi smezger!
Vielleicht kannst du ja über eine .HTACCESS-Datei eine Einstellung am Apache ändern.
- http://httpd.apache.org/docs/2.2/env.html
- http://httpd.apache.org/docs/2.2/mod/mo ... tml#setenv
- http://httpd.apache.org/docs/2.2/mod/mo ... ml#passenv
mfg
Gerold
Vielleicht kannst du ja über eine .HTACCESS-Datei eine Einstellung am Apache ändern.
- http://httpd.apache.org/docs/2.2/env.html
- http://httpd.apache.org/docs/2.2/mod/mo ... tml#setenv
- http://httpd.apache.org/docs/2.2/mod/mo ... ml#passenv
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nebenbei: Du überschreibst mit Deinem gezeigten Zugriff auf os.environ["LD_LIBRARY_PATH"] den String und ergänzt ihn nicht. Das solltest Du aber tun - egal, ob die Variable vorher definiert ist oder nicht. Sonst hast Du irgendwann anders anders auch noch Probleme.
Außerdem: Wieso weißt Du bei diesem Trace Back, daß es der LD_LIBRARY_PATH ist, den Du ändern mußt?
Gruß,
Christian
Außerdem: Wieso weißt Du bei diesem Trace Back, daß es der LD_LIBRARY_PATH ist, den Du ändern mußt?
Gruß,
Christian
Das mit dem Apache ist ne Idee, schon vor dem Ausführen den Pfad ändern. Werd ich mal anschaun.
Ich weis dasses der LD_LIBRARY_PATH ist, weil wenn ich ihn global ändere das Problem gelöst ist Und ist ja auch ne Lib wo er nich findet.
Das mit dem überschreiben und ergänzen hast natürlich recht, aber da es ja sowiso nur für den Moment der Scriptausführung ist und defaultmäßig nichts drin steht. War ja auch nur schnell zum testen. Tut nich also sowiso überholt.
Meld mich auf jedenfall noch mit der Lösung. Big THX erstmal an alle die mir so schnell geholfen haben !!!
Ich weis dasses der LD_LIBRARY_PATH ist, weil wenn ich ihn global ändere das Problem gelöst ist Und ist ja auch ne Lib wo er nich findet.
Das mit dem überschreiben und ergänzen hast natürlich recht, aber da es ja sowiso nur für den Moment der Scriptausführung ist und defaultmäßig nichts drin steht. War ja auch nur schnell zum testen. Tut nich also sowiso überholt.
Meld mich auf jedenfall noch mit der Lösung. Big THX erstmal an alle die mir so schnell geholfen haben !!!
Vielleicht ändert der Webserver-Prozess auch sein `root`-Verzeichnis und `/usr/home/www/web20/htdocs` ist gar nicht, oder nicht unter diesem Pfad erreichbar
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Kann es nicht einfach sein, das diese Oracle Modul einfach nicht richtig installiert wurde??? IMHO braucht man bei keinem Python-DB-Modul einen Pfad erweitern...smezger hat geschrieben:Traceback (most recent call last):
File "test.cgi", line 16, in <module>
import cx_Oracle
ImportError: libclntsh.so.9.0: cannot open shared object file: No such file or directory
Existiert überhaupt diese libclntsh.so.9.0 ?
Ganz klar, daß das nicht geht. LD_LIBARY_PATH wird vom Loader einmal beim Programmstart ausgewertet und dann nie wieder angeschaut.
Ich hab das Problem mal so gelöst, daß ich eine zweite Umgebungsvariable
setze, wenn mein Program den LD_LIBRARY_PATH bereits geändert hat.
Ist LD_LIBRARY_PATH noch nicht verändert worden, verwende ich os.execv um das Program gleich nochmal zu starten.
Das ganze sieht bei mir - am Ende vom Startskript - so aus:
Das wär die Idee für eine allgemeine pure-python Lösung. Natürlich ist es besser, wenn man den exec-Aufruf vermeiden kann.
Ich hab das Problem mal so gelöst, daß ich eine zweite Umgebungsvariable
setze, wenn mein Program den LD_LIBRARY_PATH bereits geändert hat.
Ist LD_LIBRARY_PATH noch nicht verändert worden, verwende ich os.execv um das Program gleich nochmal zu starten.
Das ganze sieht bei mir - am Ende vom Startskript - so aus:
Code: Alles auswählen
import sys
from os import environ, execv
if environ.get( "PYDYNPACK_ENV" ) != "SET":
environ[ "LD_LIBRARY_PATH" ] = abspath( "somepath" )
environ[ "PYDYNPACK_ENV" ] = "SET"
execv( sys.argv[ 0 ], sys.argv )
del sys, environ, execv