python: Pfad in(!) der Datei anzeigen lassen

Gast #4596690
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?
Gast #4597135
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
Gast #4597313
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.
#4597439
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.
Gast #4599040
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.
#4599060
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren