How to know who is importing me in python?

How can I find out what file is importing a particular file in python?

Consider the following example:

#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? ... 

All the files a.py, b.py and cmn.py are in the same directory.

Why do I want to do this?
In C/C++, they have include feature. What i want to do can illuminate by the C/C++ code.

//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..... 

In C/C++, we can use this method to reuse sourecode.

Now return to my python code.
When a.py import cmn.py, i hope to run cmn.py and the cmn.py will refer to the symbol defined in the a.py.
When b.py import cmn.py, i hope to run cmn.py and the cmn.py will refer to the symbol defined in the b.py.

Add Comment
3 Answer(s)

The namedtuple code in the collections module has an example of how (and when) to do this:

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

One limitation of this approach is that the outermost module is always named __main__. If that is the case, the name of the outermost module can be determined from sys.argv[0].

A second limitation is that if the code using sys._getframe is in the module scope it is only executed on the first import of cmn.py. You’d need to call a function of some sort after imports if you want to monitor all imports of the module.

Answered on July 16, 2020.
Add Comment

Well, this is a kind of bizarre thing to do. You haven’t explained why you want to know what is importing your module, so I can’t actually help you solve your problem. You also haven’t explained how or when you want to know the importing module.

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 

This will give you an iterator over all the modules which use your module as a top-level object. It won’t find modules that do from cmn import *, and the list will change over time.

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

You’d need to install an import hook that tracks all imports. See PEP 302 and http://docs.python.org/dev/py3k/library/importlib.html. However, as the comments above point out, there is probably a better way to structure your code.

Add Comment

Your Answer

By posting your answer, you agree to the privacy policy and terms of service.