【问题标题】:How do I find the name of the file that is the importer, within the imported file?如何在导入的文件中找到作为导入器的文件的名称?
【发布时间】:2009-09-21 22:56:31
【问题描述】:

如何在导入的文件中找到作为“导入器”的文件的名称?

如果a.pyb.py都导入c.py,那c.py到底能知道导入它的文件名吗?

【问题讨论】:

  • 如果你想知道这两个名字,答案是否定的;第二个导入只会引入对现有模块的引用。这只不过是一项任务。

标签: python import


【解决方案1】:

使用

sys.path[0]

返回启动 python 解释器的脚本的路径。如果您可以直接使用此脚本,它将返回脚本的路径。但是,如果脚本是从另一个脚本导入的,它将返回该脚本的路径。

Python Path Issues

【讨论】:

    【解决方案2】:

    在c.py的顶层(即任何函数或类之外),你应该可以通过运行得到你需要的信息

    import traceback
    

    然后检查 traceback.extract_stack() 的结果。在顶层代码运行时,模块的导入器(及其递归导入器等)都在调用堆栈上。

    【讨论】:

    • 谢谢菲尔,这是最接近我需要的。我会标记它有帮助,但我缺乏所需的代表点。 :)
    【解决方案3】:

    这就是你有参数的原因。

    c.py 的工作不是确定是谁导入的。

    a.pyb.py 的工作是将变量 __name__ 传递给 c.py 中的函数或类。

    【讨论】:

    • 您提出了一个很好的论点和技术,但我的代码需要在导入执行后立即执行操作(方法覆盖)。为简单起见,我希望自动找到引用,而不是在导入行之后调用具有 name 参数的类。
    【解决方案4】:

    可以通过inspecting栈来完成:

    #inside c.py:
    import inspect
    FRAME_FILENAME = 1
    print "Imported from: ", inspect.getouterframes(inspect.currentframe())[-1][FRAME_FILENAME]
    #or:
    print "Imported from: ", inspect.stack()[-1][FRAME_FILENAME]
    

    但是检查堆栈可能是错误的。为什么您需要知道从哪里导入文件?为什么不让导入的文件(a.pyb.py)将名称传递给c.py? (假设您可以控制a.pyb.py

    【讨论】:

    • 不仅“可能有问题”,而且“无法按预期工作”,因为即使多次导入,模块也只会被评估一次。
    猜你喜欢
    • 2021-09-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2021-08-16
    • 2013-08-21
    • 2012-06-13
    相关资源
    最近更新 更多