我正在创建一个可通过打包的__main__.py
执行并安装的程序,因此我可以从命令行中以my_module_name
的形式运行它。一切都很好。
我正在尝试从该__main__.py
文件配置一个记录器,该文件从子模块中按层次使用。子模块中的记录器都通过执行以下操作来获取记录器:
logger = logging.getLogger(__name__)
这很棒,因为名字是my_module_name.Controllers.A
等。我想从my_module_name.Controllers
设置__main__.py
,但是我似乎找不到任何地方的my_module_name
直接调试并执行__main__.py
。我知道这有点时髦,因为python并没有真正将__main__.py
作为模块来执行...但是它位于my_module_name
目录中。仅仅抓住这个名称是否很容易?我是否正沿着正确的道路前进?
谢谢
答案 0 :(得分:1)
TL; DR。是的,您基本上已经在做正确的事情。 :)
运行__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__
应该是什么,或者如果稳定的话,只需输入名称即可。