名称空间Python包(no __init__.py
)和常规Python包(有一个__init__.py
)之间有什么区别,尤其是当常规包的__init__.py
为空时?
我很好奇,因为最近我忘记了在我制作的包装中制作__init__.py
个,而且我从来没有注意到任何问题.事实上,它们的行为似乎与常规软件包相同.
编辑:名称空间包仅在Python 3.3(see PEP 420)中受支持,所以很自然,这个问题只适用于Python 3.
名称空间Python包(no __init__.py
)和常规Python包(有一个__init__.py
)之间有什么区别,尤其是当常规包的__init__.py
为空时?
我很好奇,因为最近我忘记了在我制作的包装中制作__init__.py
个,而且我从来没有注意到任何问题.事实上,它们的行为似乎与常规软件包相同.
编辑:名称空间包仅在Python 3.3(see PEP 420)中受支持,所以很自然,这个问题只适用于Python 3.
从Python 3.3开始,我们得到了名称空间包.这是一种特殊的包,允许您在Python路径的不同点上统一两个同名的包.例如,将PATH1和PAT2视为Python路径上的单独条目:
path1
+--namespace
+--module1.py
+--module2.py
path2
+--namespace
+--module3.py
+--module4.py
通过这种安排,你应该能够做到以下几点:
from namespace import module1, module3
因此,您可以在一个名称空间中统一两个同名的包.
如果其中任何一个获得了一个__init__.py
,变成了the包,并且你不再获得统一,因为另一个目录被忽略.
如果两者都有一个__init__.py
,那么PYTHONPATH(sys.path
)中的第一个就是使用的那个.
__init__.py
used to be required to make directory a package命名空间包是没有__init__.py
的包.
以简单软件包为例,如果您有目录:
root
+--package
+--file1.py
+--file2.py
...
虽然您可以在package
目录中独立运行这些文件,例如使用python2 file1.py
,但在Python2下,您将无法将这些文件作为模块导入根目录,例如.
import package.file1
会失败,为了让它工作,你至少需要:
package
+--__init__.py
+--file1.py
+--file2.py
...
__init__.py
初始化程序包,以便在首次导入模块时运行__init__.py
中的代码:
run_initial_import_setup()
提供__all__
个要导入的名称列表,
__all__ = ['star_import', 'only', 'these', 'names']
如果导入的软件包包含以下内容:
from module import *
或者,如果只想导入剩余的,可以将__init__.py
完全清空.目录中的py文件.
__init__.py
using pkgutil:最初可以使用pkgutil,从Python 2.3开始提供.要完成添加名称空间,请将以下内容添加到每个单独包的__init__.py
中:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
Setuptools使用类似的方法,同样,所有__init__.py
个文件都应该包含以下内容(没有其他代码):
import pkg_resources
pkg_resources.declare_namespace(__name__)
名称空间在PEP 420年得到了更彻底的解决
请参见此处有关设置工具和名称空间的更多讨论:
http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages