662 Stimmen

Name des aktuellen Skripts in Python abfragen

Ich versuche, den Namen des Python-Skripts abzurufen, das gerade ausgeführt wird.

Ich habe ein Skript namens foo.py und ich würde gerne so etwas tun, um den Skriptnamen zu erhalten:

print(Scriptname)

8voto

TheOnlyAnil Punkte 779

Sie können dies tun, ohne os oder andere Libs zu importieren.

Wenn Sie den Pfad des aktuellen Python-Skripts erhalten möchten, verwenden Sie: __file__

Wenn Sie nur den Dateinamen ohne .py-Erweiterung erhalten möchten, verwenden Sie dies:

__file__.rsplit("/", 1)[1].split('.')[0]

4voto

bitranox Punkte 1238

All diese Antworten sind großartig, haben aber einige Probleme, die man vielleicht nicht auf den ersten Blick sieht.

lassen Sie uns definieren, was wir wollen - wir wollen den Namen des Skripts, das ausgeführt wurde, nicht den Namen des aktuellen Moduls - also __file__ funktioniert nur, wenn es im ausgeführten Skript verwendet wird, nicht in einem importierten Modul. sys.argv ist auch fragwürdig - was ist, wenn Ihr Programm von pytest ? oder pydoc runner ? oder von uwsgi aufgerufen wurde ?

und - es gibt eine dritte Methode, um den Skriptnamen zu erhalten, die ich in den Antworten nicht gesehen habe - Sie können den Stapel untersuchen.

Ein weiteres Problem besteht darin, dass Sie (oder ein anderes Programm) an der sys.argv y __main__.__file__ - Sie kann vorhanden sein oder auch nicht. Es kann gültig sein oder auch nicht. Zumindest können Sie überprüfen, ob das Skript (das gewünschte Ergebnis) vorhanden ist!

die Bibliothek lib_programmname tut genau das:

  • prüfen, ob __main__ vorhanden ist
  • prüfen, ob __main__.__file__ vorhanden ist
  • gibt __main__.__file__ ein gültiges Ergebnis (gibt es dieses Skript?)
  • wenn nicht: sys.argv überprüfen:
  • Gibt es pytest, docrunner usw. in der sys.argv? --> wenn ja, ignorieren Sie das
  • können wir hier ein gültiges Ergebnis erhalten?
  • wenn nicht: den Stapel inspizieren und das Ergebnis von dort möglicherweise ablesen
  • wenn auch der Stack kein gültiges Ergebnis liefert, dann wird eine Exception geworfen.

Übrigens, meine Lösung funktioniert bisher mit setup.py test , uwsgi , pytest , pycharm pytest , pycharm docrunner (doctest) , dreampie , eclipse

Es gibt auch einen schönen Blog-Artikel über dieses Problem von Dough Hellman, "Determining the Name of a Process from Python".

BTW, das wird sich in Python 3.9 wieder ändern: die Datei Attribut des Haupt Modul wurde ein absoluter Pfad statt eines relativen Pfades. Diese Pfade bleiben nun gültig, nachdem das aktuelle Verzeichnis mit os.chdir() geändert wurde

Ich möchte mich also lieber um ein kleines Modul kümmern, anstatt meine Codebasis zu überfliegen, wenn es irgendwo geändert werden soll ...


Haftungsausschluss: Ich bin der Autor der lib_programname-Bibliothek.

1voto

PeterXX Punkte 488

Da der OP nach dem Namen der aktuellen Skriptdatei gefragt hat, würde ich Folgendes vorziehen

import os
os.path.split(sys.argv[0])[1]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X