2012-07-28 169 views
18

对于我的应用程序中的详细调试消息,我正在使用返回有用前缀的函数。请看下面的例子:Python - 获取完整包模块名称

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: Doing some awesome stuff right here

我的问题是:当我有一个模块中的组件,例如 'myproject.utilities.input',从get_verbose_prefix返回的模块名称仍然是“输入”,而不是“myproject.utilities.input”。这大大减少了大型项目中前缀的有用性,因为在不同的子模块中可以有几个“输入”模块一起工作。

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

回答

27

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

+1

我想这是真的,但我如何才能从实际的模块我的前缀函数的上下文? – Hubro 2012-07-28 22:25:04

+8

没关系,我想明白了:'inspect.getmodule(s [1] [0]).__ name__'。你也应该编辑'__name__'实际上并不总是返回模块的全名,因为它在执行的模块上返回'__main__' – Hubro 2012-07-28 22:33:07

+0

inspect.getmodule(s [1] [0])中的''' ).__ name__'? – 2017-06-22 05:27:19

6

尝试使用模块的__name__属性。

2

在其包装内取出完整的模块名称的简单方法:

print(__file__)