Library Path während Laufzeit ändern ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
smezger
User
Beiträge: 6
Registriert: Montag 23. Oktober 2006, 10:50

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...)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

smezger hat geschrieben:Gibt es da irgendeine Lösung ? (sys.path.append geht nicht...)
Hi smezger!

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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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:

Code: Alles auswählen

echo $LD_LIBRARY_PATH
, wobei ich unterstelle, daß Du mit BASH arbeitest.)
Ansonsten kannst Du so Deinen Pfad dem LD_LIBRARY_PATH hinzufügen:

Code: Alles auswählen

export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}/:DEINVERZEICHNIS/"
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.
Zuletzt geändert von CM am Montag 23. Oktober 2006, 13:39, insgesamt 1-mal geändert.
smezger
User
Beiträge: 6
Registriert: Montag 23. Oktober 2006, 10:50

@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)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
BlackJack

smezger hat geschrieben: Mit welcheer Funktion kann ich dann den LD_LIBRARY_PATH ändern ? (nochmal: kein Zugang zum Server)
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
User
Beiträge: 6
Registriert: Montag 23. Oktober 2006, 10:50

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...
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
smezger
User
Beiträge: 6
Registriert: Montag 23. Oktober 2006, 10:50

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...
Benutzeravatar
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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
smezger
User
Beiträge: 6
Registriert: Montag 23. Oktober 2006, 10:50

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 !!!
BlackJack

Vielleicht ändert der Webserver-Prozess auch sein `root`-Verzeichnis und `/usr/home/www/web20/htdocs` ist gar nicht, oder nicht unter diesem Pfad erreichbar
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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
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...
Existiert überhaupt diese libclntsh.so.9.0 ?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
smezger
User
Beiträge: 6
Registriert: Montag 23. Oktober 2006, 10:50

Jap, is alles richtig installiert....

Eine .htaccess Datei mit
SetEnv LD_LIBRARY_PATH ...
hat mein Problem gelöst. Jetzt findet er alles Libs.

Danke nochmal an alle, die mir geholfen haben !
Gromit
User
Beiträge: 51
Registriert: Montag 8. Mai 2006, 19:07

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:

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
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.
Antworten