Ich versuche, die tatsächliche aktuelle Modul einer Funktion zu ermitteln (wie gesehen, wenn von anderswo importiert), auch wenn das aktuelle Modul ist "top level scripting environment" __main__
.Python: tatsächliche aktuelle Modul (nicht __main__)
Es mag wie eine komische Sache zu tun, aber der Hintergrund ist, dass ich eine Funktion serialisieren und esserialisieren (einschließlich Argumente) auf einer anderen Maschine, für die ich sicherstellen muss, dass das richtige Modul und nicht __main__
wird vor dem Deserialisieren importiert (sonst bekomme ich eine Fehlermeldung mit AttributeError: 'module' object has no attribute my_fun
).
Bisher habe ich inspection versucht:
import inspect
print inspect.getmodule(my_fun)
die mich
<module '__main__' from 'example.py'>
natürlich gibt. Ich habe auch versucht, etwas nützlich zu finden mit globals()
, kein Glück.
Was ich wirklich will, ist <module 'example' from 'example.py'>
. Ich nehme an, ein hacky Weg, um es aus dem Dateinamen so etwas wie
m_name = __main__.__file__.split("/")[-1].replace(".pyc","")
und dann finden Sie das Modul mit Namen sys.modules[m_name]
mit zu analysieren wäre.
Gibt es einen saubereren/besseren Weg, dies zu tun?
EDIT: Nach dem Lernen über ipython der „FakeModule“ und ein bisschen mehr googeln, Ich habe accross this post, die genau das Problem beschreibt, dass ich bin vor, auch meine aktuelle Lösung, um es (die explizit das aktuelle Modul importiert import current_module
und Serialisierung current_module.my_fun
anstelle von my_fun). Ich versuche, dies zu vermeiden, da es für die Benutzer meines Pakets nicht intuitiv ist.
Haben Sie sich schon einmal die Interna der 'nose' Bibliothek angeschaut, speziell das' importer' Modul? "nose" macht einige Dinge sehr ähnlich, also könnte es ein guter Ort sein, um nach Inspiration zu suchen. –