Python 确定导入模块的名称

3
你如何在被导入的模块内确定导入模块的名称。我有部分解决方案,但不完整。
代码如下: A.py
import B

if __name__ == '__main__':
    print 'This a test'

The B.py

import sys
import C
if sys.argv[0] == 'A':
    doSomething()

现在,我已经准备好了,因为在模块B内,我知道调用导入的主程序的名称,即A。然而,在B中,请求导入C,并且我想知道是B导入了C吗?如何实现这一点?


您介意分享一些背景,解释一下您为什么想这样做吗? - Jon Clements
Jon,我有一个项目,正在使用一个团队构建的库。在库中有一个模块的导入,由于路径问题而崩溃。我的意图是在库中添加一行代码,如果myProject正在导入此模块,则不要导入此崩溃的模块,因为我根本没有用它。我刚刚被告知,我的请求定义不清晰,因为Python只会导入一个模块,所以这个方案可能不够健壮。 - Charles Paxson
3个回答

2

sys.argv[0]不是模块名称,在执行import时,这是可执行文件的名称。

另一方面,在Python模块内部,如果通过导入执行,则__name__等于模块名称;如果作为脚本执行,则等于"__main__"

模块不知道谁执行了import(没有"parent"属性或类似的东西)。使用不同的函数定义您的行为,并从不同的模块中调用它们。


在不同的模块中定义不同的函数并调用它们来定义你的行为。 - mbatchkarov

0

我怀疑这并不是你想要做的事情。特别需要注意的是,B模块中的顶层代码只会运行一次,无论从多少个地方导入该模块。

例如,如果你在其他地方也导入了D模块,并且在B模块之前导入了C模块,那么当从B导入C时,C模块中的代码将永远不会运行。

我认为更好的做法可能是在C模块中定义一个函数,然后让B在导入C后运行该函数一次。


0

你可以尝试使用interpreter-stacktraceback。两者都会给出堆栈的函数调用,所以这不是你想要的解决方案(模块)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接