python __name__属性带来命名空间问题
代码如下:
https://code.****.net/lijiecong/examples/tree/master/python/clicktest
有两个python源文件
clicktest.py
clicktest2.py
其中clicktest2.py通过importlib动态加载clicktest,clicktest.py直接通过 from import引用 clicktest2.py中的 cli,并且往cli里加载commit函数。
如果直接运行python clicktest2.py ,通过打印可以发现clicktest2.py里打印出来的cli.commands永远只有 clicktest2中的函数,而没有clicktest加的额外commit函数。但clicktest中能打印出commit和sync两个函数。
而如果通过在python交互环境中import clicktest2的方式运行,却可以看到sync和commit都加入了。
仔细观察 module name和 cli id可以发现是python设置模块加载名字引起的问题,python clicktest2.py 会设置 clictest2的__name__为 ‘__main__’,
当clicktest from clicktest2 import cli时,python发现没有模块名字叫 clicktest2( 先前加载的clicktest2的模块名字被设置为__main__),所以把clicktest2加载到了
命名空间clicktest2中,相当于 有两个cli分别存在于命名空间 __main__ 以及 clicktest2,是两个不同的变量。 第一行打印出的 cli ID 41672376是由 python clicktest2.py加载的,第二个 cli ID 46053920 是有 clicktest中 from clicktest2 import cli加载的。
同时看到如果在python交互环境中通过import clicktest2, 然后直接entry_point ,那么只有一个 cli位于module name clicktest2中。因为import clictest2设置的模块名字为clicktest2,当clicktest 运行from clicktest2 import cli时,python发现已经有clicktest2模块了,就从已经加载的模块中提取cli。