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

Yun*_*ncy 11 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?
...
Run Code Online (Sandbox Code Playgroud)

所有文件a.py,b.pycmn.py在同一个目录下.

我为什么要这样做?
在C/C++中,它们具有包含功能.我想做的事情可以通过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.....
Run Code Online (Sandbox Code Playgroud)

在C/C++中,我们可以使用此方法来重用sourecode.

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

Ray*_*ger 11

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

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

这种方法的一个限制是最外面的模块总是被命名__main__.如果是这种情况,可以从中确定最外层模块的名称sys.argv[0].

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

  • 如何为 py3 实现类似的东西? (2认同)