运行 __main__.py 时,获取当前模块

fou*_*r43 5 python logging module

我正在创建一个可通过打包__main__.py和安装执行的程序,因此我可以像从命令行一样简单地运行它my_module_name。这一切都很好。

我正在尝试从该__main__.py文件配置一个记录器,该文件从子模块分层使用。子模块中的记录器都通过执行以下操作来获取记录器:

logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)

这很好,因为 name ismy_module_name.Controllers.A等。我希望从中进行设置my_module_name.Controllers__main__.pymy_module_name在我__main__.py直接调试和执行时似乎找不到任何地方。我知道这有点奇怪,因为 python 并没有真正__main__.py作为模块执行......但它在my_module_name目录中......只是抓住这个名字是不是很糟糕?我是否走上了正确的道路?

谢谢

Ond*_* K. 4

TL;博士。是的,你基本上已经在做正确的事情了。:)

运行时无法获取“当前模块” __main__.py。这归结为模块和(作为模块执行的)脚本(或“主模块”)之间的差异,其详细信息在PEP-338中描述:

在主模块中, 的值__name__始终是'__main__'

PEP-366中有一条关于相对导入的额外信息。__package__归因已被引入。还有这样一个信息:

当主模块由其文件名指定时,该__package__属性将设置为None. 为了在直接执行模块时允许相对导入,在第一个相对导入语句之前需要类似于以下的样板:

if __name__ == "__main__" and __package__ is None: __package__ = "expected.package.name"

换句话说。当直接调用时,模块__name__"__main__"__package__属性是None,您必须自己设置它以供(相对导入工作或)任何(其他)使用。你可以尝试猜测,应该基于什么,__file__或者如果稳定的话,你可以直接写上名字。