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)
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)
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:
__main__
vorhanden ist__main__.__file__
vorhanden ist__main__.__file__
ein gültiges Ergebnis (gibt es dieses Skript?)Ü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.
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.