python: Pfad in(!) der Datei anzeigen lassen

Gast #4596690
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
[~/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
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.
Gast
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)
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.