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

时间:2018-07-12 22:50:43

标签: python logging module

我正在创建一个可通过打包的__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目录中。仅仅抓住这个名称是否很容易?我是否正沿着正确的道路前进?

谢谢

1 个答案:

答案 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__应该是什么,或者如果稳定的话,只需输入名称即可。