【问题标题】:Get full package module name获取完整的包模块名称
【发布时间】:2012-07-27 03:36:28
【问题描述】:

对于我的应用程序中的详细调试消息,我使用了一个返回有用前缀的函数。考虑以下示例:

import inspect

def get_verbose_prefix():
    """Returns an informative prefix for verbose debug output messages"""
    s = inspect.stack()
    module_name = inspect.getmodulename(s[1][1])
    func_name = s[1][3]

    return '%s->%s' % (module_name, func_name)

def awesome_function_name():
    print "%s: Doing some awesome stuff right here" % get_verbose_prefix()

if __name__ == '__main__':
    awesome_function_name()

这个输出:

test->awesome_function_name:在这里做一些很棒的事情

我的问题是:当我在包中有一个模块时,例如“myproject.utilities.input”,从get_verbose_prefix 返回的模块名称仍然只是“输入”,而不是“ myproject.utilities.input'。当不同的子模块中可能有多个“输入”模块一起工作时,这会大大降低前缀在大型项目中的作用。

所以我的问题是: 有没有一种简单的方法可以在 Python 的包中检索完整的模块名称?我计划扩展get_verbose_prefix 函数以检查模块父目录中的“__init__.py”文件以推断它的全名,但首先我想知道是否有更简单的方法来做到这一点。

【问题讨论】:

  • 注意:在Python打包的上下​​文中,“包名”≠“导入路径”。包可以包含不一定以包本身命名的模块和命名空间。

标签: python inspect


【解决方案1】:

__name__ 始终包含模块的全名。 (当然,除了 __main__ 在 main 上。)

【讨论】:

  • 我想这是真的,但是如何从我的前缀函数的上下文中获取实际模块?
  • 没关系,我想通了:inspect.getmodule(s[1][0]).__name__。此外,您应该编辑 __name__ 实际上并不总是返回模块的全名,因为它在执行的模块上返回 __main__
  • s 中的inspect.getmodule(s[1][0]).__name__ 是什么?
  • @QuentinRoy s = inspect.stack()
  • buried comment by the questioner 回答问题比任何实际答案都好时的感觉。
【解决方案2】:

尝试使用模块的__name__ 属性。

【讨论】:

    【解决方案3】:

    在其包中检索完整模块名称的简单方法:

    print(__file__)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-29
      • 2017-12-05
      • 2022-10-02
      • 2013-11-06
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多