【问题标题】:How to get the name of the file that is importing it in Python如何获取在 Python 中导入它的文件的名称
【发布时间】:2020-03-26 21:07:27
【问题描述】:

我有 3 个文件,ma​​in.pymodule2.pymodule3.py

module2.py 和 module3.py 都导入 main.py。我想知道是否有办法找出哪个文件正在导入 main.py。

为了展示我想要使用代码实现的目标,这就是我想要使用 main.py 做的事情:

if __name__ == '__main__':
    print(__name__)
else:
    print(name_of_the_file_that_is_importing_me) # module2 or module3

我找到了一些类似 this one 的答案,它已经过时了,并且不能完全按照我想要的方式工作。

我希望这个问题是有道理的,并提前感谢大家!

【问题讨论】:

    标签: python file import module


    【解决方案1】:

    基于使用traceback 模块的answer,此代码应该适用于您的示例。

    main.py

    import traceback
    
    if __name__ == '__main__':
        print(__name__)
    else:
        stack = traceback.extract_stack()
        print(stack[0].filename)
    

    请注意,仅当您只有一层导入时,仅抓取堆栈 0 才有效。如果您有多个导入层,那么您需要通过堆栈向后工作以提取立即导入。

    如果您有多个导入层,则此代码应获取立即导入的文件。

    import traceback
    
    if __name__ == '__main__':
        print(__name__)
    else:
        stack = traceback.extract_stack()
        modules = [x for x in stack if 'importlib' not in x.filename]
        print(modules[-2].filename)
    

    请注意,traceback 模块包括导入模块的多个 importlib 层,因此这会过滤掉第一个并引用倒数第二个模块,因为最后一个模块将是 main.py,因此倒数第二个是立即生成的模块导入。

    【讨论】:

    • 有效!非常感谢你。但是,多层导入是什么意思?
    • 通过多层导入,我的意思是如果 module3 导入 module2 导入 main。在这种情况下,我的第一个解决方案会给你 module3。在这种情况下,我的第二个解决方案会给你 module2,因为 module2 是实际导入的 main。
    • 我明白你的意思。就我而言,这不是问题。但是,打印所有的导入层肯定会很有趣。我认为在某些情况下它可能对调试有用。无论如何,非常感谢您的澄清!
    猜你喜欢
    • 2019-02-18
    • 2016-01-27
    • 2012-02-25
    • 2021-08-12
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多