Wie kann ich auf das aktuelle Ausführungsmodul oder den Klassennamen in Python zugreifen?

Ich möchte in der Lage sein, das aktuelle Ausführungsmodul oder den Klassennamen aus einem importierten Modul dynamisch abzurufen. Hier ist ein Code:

Foo.py:

def f(): print __name__ 

Bar.py:

 from foo import f def b(): f() 

Dies funktioniert offensichtlich nicht als __name__ ist der Name des Moduls, das die Funktion enthält. Was ich gerne in das foo Modul zugreifen möchte, ist der Name des aktuellen Ausführungsmoduls, das mit foo . Also im obigen Fall wäre es bar aber wenn ein anderes Modul importiert foo Ich möchte foo um dynamisch Zugriff auf den Namen des Moduls haben.

Bearbeiten: Das inspect sieht sehr vielversprechend aus, aber es ist nicht genau das, was ich gesucht habe. Was ich hoffte, war eine Art globale oder umweltfreundliche Variable, auf die ich zugreifen konnte, die den Namen des aktuellen Ausführungsmoduls enthalten würde. Nicht, dass ich nicht bereit bin, den Stapel zu durchqueren, um diese Informationen zu finden – ich dachte nur, dass Python diese Daten schon ausgesetzt hat.

Bearbeiten: Hier ist, wie ich versuche, das zu benutzen. Ich habe zwei verschiedene Django-Anwendungen, die beide Fehler melden müssen. Lets sagen, dass sie "AppOne" und "AppTwo" genannt werden. Ich habe auch einen Platz, zu dem ich diese Dateien protokollieren möchte: " /home/hare/app_logs ". In jeder Anwendung an einem beliebigen Punkt möchte ich in der Lage sein, mein Logger-Modul zu importieren und die Log-Funktion aufzurufen, die den Log-String in die Datei schreibt. Allerdings, was ich gerne tun würde, ist ein Verzeichnis unter app_logs , die den Namen der aktuellen Anwendung ("AppOne" oder "AppTwo"), so dass jede Anwendung Log-Dateien werden in ihre jeweiligen Logging-Verzeichnisse gehen.

Um dies zu tun, dachte ich, dass der beste Weg für das Logger-Modul sein würde, Zugriff auf eine Art globale Variable zu haben, die den Namen der aktuellen Anwendung angibt, da sie dafür verantwortlich ist, den Standort des übergeordneten Logging-Verzeichnisses zu kennen und die Protokollierung der Anwendung zu erstellen Verzeichnis, falls es noch nicht existiert.

9 Solutions collect form web for “Wie kann ich auf das aktuelle Ausführungsmodul oder den Klassennamen in Python zugreifen?”

Aus dem Kommentar – nicht die Frage.

"Ich bin nur neugierig zu sehen, ob das, was ich versuche zu tun, möglich ist."

Die Antwort auf "ist es möglich" ist immer "ja". Immer. Es sei denn, Ihre Frage beinhaltet Zeitreise, Anti-Schwerkraft oder ständige Bewegung.

Da die Antwort immer "ja" ist, ist deine Frage schlecht geformt. Die eigentliche Frage ist: "Was ist ein guter Weg, um meine Logging-Modul kennen den Namen des Kunden?" oder etwas ähnliches.

Die Antwort lautet: "Akzeptiere es als Parameter". Verwirren Sie nicht mit Inspektion oder suchen Sie nach mysteriösen Globalen oder anderen Tricks.

Folgen Sie einfach dem Designmuster von logging.getLogger () und verwenden Sie explizit benannte Logger. Ein gemeinsames Idiom ist das folgende

 logger= logging.getLogger( __name__ ) 

Das behandelt fast alle Log-Namensgebung perfekt.

Dies sollte für die Referenzierung des aktuellen Moduls funktionieren:

 import sys sys.modules[__name__] 

Das "aktuell ausgeführte Modul" ist eindeutig foo, denn das ist, was die aktuell laufende Funktion enthält – ich denke eine bessere Beschreibung, was du willst, ist das Modul von foo's unmittelbarer Anrufer (was selbst foo sein kann, wenn du af () Von einer Funktion in foo, die von einer Funktion in bar aufgerufen wird. Wie weit willst du hinaufgehen, hängt davon ab, was du willst.

In jedem Fall, vorausgesetzt, Sie wollen den sofortigen Anrufer, können Sie dies durch den Aufstieg der Call-Stack zu erhalten. Dies kann erreicht werden, indem man sys._getframe , mit der passenden Anzahl von Ebenen zu gehen.

 def f(): caller = sys._getframe(1) # Obtain calling frame print "Called from module", caller.f_globals['__name__'] 

[Bearbeiten] : Tatsächlich ist die Verwendung des Inspektionsmoduls, wie oben angedeutet, wahrscheinlich eine sauberere Möglichkeit, den Stapelrahmen zu erhalten. Der gleichwertige Code ist:

 def f(): caller = inspect.currentframe().f_back print "Called from module", caller.f_globals['__name__'] 

(Sys._getframe ist dokumentiert als interne Verwendung – das Inspektionsmodul ist eine zuverlässigere API)

Ich denke, was Sie verwenden möchten, ist das Inspektionsmodul , um den Pythonlaufzeitstapel zu inspizieren. Schauen Sie sich dieses Tutorial an . Ich denke, es bietet ein fast genaues Beispiel dafür, was du machen willst.

__file__ ist der Pfad des aktuellen Moduls der Aufruf erfolgt.

Ich glaube nicht, dass das möglich ist, da das aus foo Umfang ist. Foo wird sich nur bewusst sein, dass es sich um einen internen Bereich handelt, da er von unzähligen anderen Modulen und Anwendungen aufgerufen werden kann.

Mit __file__ alleine gibt es einen relativen Pfad für das Hauptmodul und einen absoluten Pfad für importierte Module. Wenn wir uns dessen bewusst sind, können wir die Modul-Datei immer wieder mit einer kleinen Hilfe von unseren os.path Tools os.path .

Für Dateiname nur __file__.split(os.path.sep)[-1] .

Für den vollständigen Pfad verwenden Sie os.path.abspath(__file__) .

Demo:

 /tmp $ cat f.py from pprint import pprint import os import sys pprint({ 'sys.modules[__name__]': sys.modules[__name__], '__file__': __file__, '__file__.split(os.path.sep)[-1]': __file__.split(os.path.sep)[-1], 'os.path.abspath(__file__)': os.path.abspath(__file__), }) /tmp $ cat i.py import f 

Ergebnisse:

 ## on *Nix ## /tmp $ python3 f.py {'sys.modules[__name__]': <module '__main__' from 'f.py'>, '__file__': 'f.py', '__file__.split(os.path.sep)[-1]': 'f.py', 'os.path.abspath(__file__)': '/tmp/f.py'} /tmp $ python3 i.py {'sys.modules[__name__]': <module 'f' from '/tmp/f.pyc'>, '__file__': '/tmp/f.pyc', '__file__.split(os.path.sep)[-1]': 'f.pyc', 'os.path.abspath(__file__)': '/tmp/f.pyc'} ## on Windows ## PS C:\tmp> python3.exe f.py {'sys.modules[__name__]': <module '__main__' from 'f.py'>, '__file__': 'f.py', '__file__.split(os.path.sep)[-1]': 'f.py', 'os.path.abspath(__file__)': 'C:\\tools\\cygwin\\tmp\\f.py'} PS C:\tmp> python3.exe i.py {'sys.modules[__name__]': <module 'f' from 'C:\\tools\\cygwin\\tmp\\f.py'>, '__file__': 'C:\\tools\\cygwin\\tmp\\f.py', '__file__.split(os.path.sep)[-1]': 'f.py', 'os.path.abspath(__file__)': 'C:\\tools\\cygwin\\tmp\\f.py'} 

Wenn du das '.py' aus dem Ende streifen willst, kannst du das leicht machen. (Aber vergessen Sie nicht, dass Sie stattdessen ein '.pyc' ausführen können.)

Es ist schon eine Weile her, seit ich Python gemacht habe, aber ich glaube, dass du durch seine Rückverfolgung Zugang zu den Globalen und Einheimischen eines Anrufers bekommen kannst.

Um einen Verweis auf das Modul "__main__" zu erhalten, wenn in einem anderen:

 import sys sys.modules['__main__'] 

Um dann den Dateipfad des Moduls zu erhalten, der seinen Namen enthält:

 sys.modules['__main__'].__file__ 

Wenn im Modul "__main__" einfach: __file__

Um nur den Dateinamen aus dem Dateipfad zu erhalten:

 import os os.path.basename(file_path) 

So trennen Sie den Dateinamen von seiner Erweiterung:

 file_name.split(".")[0] 

Um den Namen einer Klasseninstanz zu erhalten:

 instance.__class__.__name__ 

Um den Namen einer Klasse zu erhalten:

 class.__name__ 
  • Pythonmechanisierungsmodul nicht gefunden
  • Gibt es irgendwelche Python Bluetooth Module für Windows 7 64 bit?
  • Python ImportError Lade-Modul im Unterordner
  • Serielle Importpythonschlange
  • Warum ändert sich der Wert von __name__ nach der Zuordnung zu sys.modules [__ name__]?
  • Reload (update) eine Moduldatei im Interpreter
  • Wie greife ich von den anderen Modulen auf die Attribute des aktuellen Ausführungsmoduls zu?
  • Python-Modul und __all__
  • __package__ ist beim Import eines Python-Moduls keine
  • Ist es möglich, Python nativ zu kompilieren (jenseits von pytes Byte-Code)?
  • Wie bekomme ich eine Liste von lokal installierten Python-Modulen?
  • Python ist die beste Programmiersprache der Welt.