Hier ist ein einfacher (und etwas rudimentärer;-) Weg, um herauszufinden, "wer versucht, was zu importieren" in Bezug auf die Modulnamen:
import inspect
import __builtin__
savimp = __builtin__.__import__
def newimp(name, *x):
caller = inspect.currentframe().f_back
print name, caller.f_globals.get('__name__')
return savimp(name, *x)
__builtin__.__import__ = newimp
was zum Beispiel folgendes ergibt (ich habe dies als tracimp.py
):
$ python -c 'import tracimp; import email; import sys; import email.mime'
email __main__
sys email
email.mime email
sys __main__
email.mime __main__
Wie Sie sehen, ist ein besonderes Merkmal der "Umhüllung" der __import__
eingebaut ist, dass es nicht durch die Tatsache zum Schweigen gebracht wird, dass ein importiertes Modul bereits in sys.modules
: denn das ist eine der wichtigsten Aufgaben __import__
Unser Wrapper wird für beide Module aufgerufen, die "zum ersten Mal geladen werden". y Diejenigen, die nur aus dem Internet geholt werden sys.modules
weil sie bereits zuvor importiert wurden. Dies ist sehr nützlich, wenn Sie versuchen, zirkuläre Importe zu diagnostizieren (es läuft darauf hinaus, Schleifen im gerichteten Graphen zu finden, deren Kanten durch die beiden Modulnamen - importiert und importer - identifiziert werden, die bei diesem einfachen Ansatz in jeder Ausgabezeile ausgegeben werden).