繁体   English   中英

获取完整的 package 模块名称

[英]Get full package module name

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

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

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

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

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

尝试使用模块的__name__属性。

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

print(__file__)

其他答案没有说明__name__成为程序入口点的__main__或没有正确处理它。

这对我有用:

def python_module() -> str:
    stack = inspect.stack()
    module = inspect.getmodule(stack[1][0])
    if module is None:
        raise ValueError("module not found")
    res = module.__name__
    if res != "__main__":
        return res
    package = module.__package__
    if package is None:
        package = ""
    mfname = module.__file__
    if mfname is None:
        return package
    fname = os.path.basename(mfname)
    ext = ".py"
    if fname.endswith(ext):
        fname = fname[:-len(ext)]
    if fname == "__init__":
        return package
    return f"{package}.{fname}"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM