Ich habe eine Python-Datei, die andere Dateien aufruft. Dabei gilt es absolute Pfade zu vermeiden. Starte ich nun das PythonScript, holt sich das Script die richtigen Dateien (von tiefer liegenden Verzeichnissen). Starte ich es allerdings von einem anderen Pfad aus, findet das Script diese Dateien nicht mehr. Gibt es die Möglichkeit innerhalb von Python heraus zu finden wo die gerade ausgeführte ScriptDatei liegt?
getcwd ist "get current working directory". Wenn das Programm in /opt/abc/bin liegt, du befindest dich in /home/user und du rufst das Programm auf, dann gibt getcwd /home/user zurück. Nicht das gewünschte /opt/abc/bin.
[~/tmp/ucnetpy/pfade.py]:
1 | #!/usr/bin/env python
|
2 | |
3 | import os |
4 | import sys |
5 | |
6 | print("gestartet in (os.getcwd()) _%s_" % os.getcwd()) |
7 | for idx, arg in enumerate(sys.argv): |
8 | print("aufgerufen mit (sys.argv[%d] _%s_)" % (idx, arg)) |
Testaufrufe:
1 | $ python ~/tmp/ucnetpy/pfade.py A 2 |
2 | $ ~/tmp/ucnetpy/pfade.py A 2 |
Oliver R. schrieb: > os.path.dirname(_file_) das müssen zwei unterstriche sein, die formatierung hat dir einen strich durch/unter die rechnung gemacht
1 | import os |
2 | print(os.path.dirname(__file__)) |
die doku dazu https://docs.python.org/3/reference/import.html#__file__ sagt aber, dass `__file__` nicht unbedingt immer gesetzt sein muss. ich würde vielleicht empfehlen nicht den weg über `__file__` zu gehen und lieber das aufrufen des scriptes entsprechend anzupassen. um eine gute lösung zu finden, müsste man aber etwas mehr informationen zu deinem problem haben.
bissia che striissia schrieb: > #!/usr/bin/env python > > import os > import sys > > print("gestartet in (os.getcwd()) _%s_" % os.getcwd()) > for idx, arg in enumerate(sys.argv): > print("aufgerufen mit (sys.argv[%d] _%s_)" % (idx, arg)) > > Testaufrufe:$ python ~/tmp/ucnetpy/pfade.py A 2 > $ ~/tmp/ucnetpy/pfade.py A 2 Das funktioniert aber auch nur, wenn man den Pfad beim Aufruf immer explizit mitgibt. Wenn das Skript irgendwo in $PATH liegt und nur rein über den Dateinamen aufgerufen wird, ist in argv[0] natürlich auch nur der drin.
python_user schrieb: > die doku dazu https://docs.python.org/3/reference/import.html#__file__ > sagt aber, dass `__file__` nicht unbedingt immer gesetzt sein muss. Unter normalen Umständen sollte `__file__` existieren. Es ist z.B. dann nicht definiert, wenn Code mit exec/execfile ausgeführt wird, was aber eher ein Sonderfall ist.
1 | #!/usr/bin/env python
|
2 | |
3 | import os |
4 | import sys |
5 | |
6 | relative_path_to_script = os.path.dirname(sys.argv[0]) or "." |
7 | absolute_path_to_script = os.path.abspath(relative_path_to_script) |
Rolf M. schrieb: > Wenn das Skript irgendwo in $PATH liegt und nur rein über den > Dateinamen aufgerufen wird, ist in argv[0] natürlich auch nur > der drin. Bei welchem Betriebssystem bzw. welcher Shell verhält sich das so? Normalerweise sollte in dem Fall der absolute Pfad in argv[0] stehen.
Schlangenbeschwörer schrieb: > Rolf M. schrieb: >> Wenn das Skript irgendwo in $PATH liegt und nur rein über den >> Dateinamen aufgerufen wird, ist in argv[0] natürlich auch nur >> der drin. > > Bei welchem Betriebssystem bzw. welcher Shell verhält sich das so? > Normalerweise sollte in dem Fall der absolute Pfad in argv[0] stehen. Hmm, grad ausprobiert. Da kommt tatsächlich der ganze Pfad. Das ist dann aber eine Python-Spezialität. Macht man das gleiche z.B. in C, ist es anders. Ich war davon ausgegangen, dass die sich gleich verhalten.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.