没有__init__的Python包

时间:2011-11-13 10:31:44

标签: python built-in

pip install - 编辑了flufl.enum Python包,我注意到它虽然缺少flufl/__init__.py模块作为常规Python包,但仍然有效。更奇怪的是:

>>> import flufl
>>> flufl
<module 'flufl' (built-in)>

我试图在没有foo/bar/__init__.py且(可预测)foo/__init__.py失败的情况下重现此创建import fooflufl如何做到这一点?

3 个答案:

答案 0 :(得分:19)

魔法是在flufl.enum-3.2-py2.7-nspkg.pth文件中完成的,该文件通过“pip install”放入site-packages中:

import sys,new,os
p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('flufl',))
ie = os.path.exists(os.path.join(p,'__init__.py'))
m = not ie and sys.modules.setdefault('flufl',new.module('flufl'))
mp = (m or []) and m.__dict__.setdefault('__path__',[])
(p not in mp) and mp.append(p)

pth文件在启动时进行评估。特别是,此文件创建一个名为“flufl”的新模块并将其放入sys.modules中。这也解释了为什么你把它看作“内置”:

>>> import new
>>> new.module('foo')
<module 'foo' (built-in)>

答案 1 :(得分:0)

我没有得到它

ls /Users/sbo/lib/python2.7/site-packages/flufl.enum-3.2-py2.7.egg/flufl/
__init__.py   __init__.pyc  enum/

您是否与python一起编译flufl.enum?它是内置模块的唯一方式。

顺便说一下,我实际上读了一个PEP,其中包可以跳过init,但我不记得它是否被批准,拒绝或受到审查。

答案 2 :(得分:0)

flufl只是一个命名空间包,在egg的namespace_packages.txt

中声明

如果你看一下它的源代码树它实际上有flufl/__init__.py,但是为了分配它作为一个鸡蛋看起来没有必要因为setuptools魔法。