[英]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.