如何知道谁在用python导入我?

如何知道谁在用python导入我?,python,import,Python,Import,如何找出在python中导入特定文件的文件 考虑以下示例: #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? ... 所有文件a.py、b.py和cmn.py都在同一目录中 我为什么要这样做 在C/C++中,它们具有include特性。我想做

如何找出在python中导入特定文件的文件

考虑以下示例:

#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?
...
所有文件
a.py
b.py
cmn.py
都在同一目录中

我为什么要这样做
在C/C++中,它们具有include特性。我想做的事情可以通过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.....
在C/C++中,我们可以使用这种方法重用sourecode

现在返回我的python代码。
当a.py导入cmn.py时,我希望运行cmn.py,cmn.py将引用a.py中定义的符号。

当b.py导入cmn.py时,我希望运行cmn.py,cmn.py将引用b.py中定义的符号。

好吧,这是一种奇怪的做法。您还没有解释为什么要知道导入模块的内容,所以我实际上无法帮助您解决问题。您还没有解释如何或何时了解导入模块

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
这将为所有将模块用作顶级对象的模块提供一个迭代器。它不会从cmn import*中找到执行
操作的模块,并且列表会随着时间的推移而改变

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

您需要安装一个跟踪所有导入的导入挂钩。见PEP 302和。但是,正如上面的评论所指出的,可能有更好的方法来构造代码。

集合模块中的namedtuple代码有一个如何(以及何时)执行此操作的示例:

#cmn.py
import sys
print 'I am being imported by', sys._getframe(1).f_globals.get('__name__')
这种方法的一个限制是,最外层的模块总是命名为
\uuuu main\uuu
。如果是这种情况,最外层模块的名称可以从
sys.argv[0]
中确定


第二个限制是,如果使用sys.\u getframe的代码在模块范围内,则仅在第一次导入cmn.py时执行。如果要监视模块的所有导入,则需要在导入后调用某种函数。

库不应该依赖于导入它们的人,所以这真的不重要。@MichaelAaronSafyan是对的。但是,正如我在这里演示的那样,这是可以做到的:。然而。。。你想要解决的真正问题是什么?你想要实现什么?也许有另一种方法可以在不耦合文件的情况下实现它。@Yuncy:是否希望所有导入的
cmn.py
cmn.py
中运行一些代码?我问这个问题是因为Python通常只导入模块一次,所以
cmn.py
通常只有一次机会知道谁导入了cmn
。Tavis Rudd的答案可能是解决方案,如果你想抓住每一个
导入cmn
@EOL,你是对的。我想这样做。根据反馈,我已经改进了我的问题。它看起来也不会处理“将foo导入为bar”。@TavisRudd:它实际上会处理
将foo导入为bar
谁导入(foo)
将返回执行导入的模块。这是因为测试是在
模块
对象上进行的(通过
是模块
),而不是在模块名称上进行的。但是请注意,报告的模块名称是原始名称(如果调用了
who_imports(bar)
,则包含导入的程序将生成name
foo
。@DietrichEpp:+1:回答问题的简洁方式。不过,
who\u imports()
函数可以优化。例如,许多
sys.modules.values()
都是
None
,可以跳过。请注意,print语句仅在第一次导入模块时执行。如果您想捕获每次导入,您需要在每次导入后从cmn.py调用函数,或者使用导入挂钩。如何实现类似于py3的功能?