¿Cómo saber quién me está importando en python?

¿Cómo puedo saber qué archivo está importando un archivo en particular en Python?

Considere el siguiente ejemplo:

#a.py import cmn .... #b.py import cmn ... #cmn.py #Here, I want to know which file (a.py or b.py) #is importing this one. #Is it possible to do this? ... 

Todos los archivos a.py , b.py y cmn.py están en el mismo directorio.

¿Por qué quiero hacer esto?
En C / C ++, tienen función de incluir. Lo que quiero hacer se puede iluminar con el código C / C ++.

 //a.cpp .... #define SOME_STUFF .... #include "cmn.h" //b.cpp ... #define SOME_STUFF .... #include "cmn.h" //cmn.h //Here, I'll define some functions/classes that will use the symbol define //in the a.cpp or b.cpp ... ....code refer to the SOME_STUFF..... 

En C / C ++, podemos usar este método para reutilizar el código fuente.

Ahora vuelve a mi código python.
Cuando a.py importe cmn.py, espero ejecutar cmn.py y cmn.py hará referencia al símbolo definido en a.py.
Cuando b.py importe cmn.py, espero ejecutar cmn.py y cmn.py hará referencia al símbolo definido en b.py.

El código de duplicación en el módulo de colecciones tiene un ejemplo de cómo (y cuándo) hacer esto:

 #cmn.py import sys print 'I am being imported by', sys._getframe(1).f_globals.get('__name__') 

Una limitación de este enfoque es que el módulo más externo siempre se llama __main__ . Si ese es el caso, el nombre del módulo más externo se puede determinar a partir de sys.argv[0] .

Una segunda limitación es que si el código que utiliza sys._getframe está en el scope del módulo, solo se ejecuta en la primera importación de cmn.py. Deberá llamar a una función de algún tipo después de las importaciones si desea monitorear todas las importaciones del módulo.

Bueno, esto es algo extraño que hacer. No ha explicado por qué quiere saber qué es lo que importa su módulo, por lo que no puedo ayudarle a resolver su problema. Tampoco ha explicado cómo o cuándo desea conocer el módulo de importación.

 def who_imports(studied_module): for loaded_module in sys.modules.values(): for module_attribute in dir(loaded_module): if getattr(loaded_module, module_attribute) is studied_module: yield loaded_module 

Esto le dará un iterador sobre todos los módulos que usan su módulo como un objeto de nivel superior. No encontrará módulos que lo hagan from cmn import * , y la lista cambiará con el tiempo.

 >>> import os >>> for m in who_imports(os): ... print m.__name__ ... site __main__ posixpath genericpath posixpath linecache 

Necesitaría instalar un gancho de importación que rastree todas las importaciones. Consulte PEP 302 y http://docs.python.org/dev/py3k/library/importlib.html . Sin embargo, como lo indican los comentarios anteriores, probablemente haya una mejor manera de estructurar su código.