Forum: PC-Programmierung python: Pfad in(!) der Datei anzeigen lassen


von montagskind (Gast)


Lesenswert?

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?

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?


von Oliver R. (Gast)


Lesenswert?

Versuche mal:

os.path.dirname(_file_)

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

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.

von bissia che striissia (Gast)


Lesenswert?

[~/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

von python_user (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Oliver R. (Gast)


Lesenswert?

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.

von Schlangenbeschwörer (Gast)


Lesenswert?

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)

von Schlangenbeschwörer (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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
Noch kein Account? Hier anmelden.