名称空间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文件.

Namespaces with __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

Python-3.x相关问答推荐

Polars.apply()通过几列

根据收件箱内部的值以行降序的特定顺序重新排序列

这是重命名极地df列的最好方式吗?

将strid()映射到Pandas DataFrame中的字符串不会更改NaN条目,但仍然声称它们不同?

从.csv导入将文件夹路径加入到文件名

visual studio代码窗口中未激活虚拟环境11

链接列未延伸到数据框的末尾

三重奏:为什么频道被记录为使用async with,而不是with?

双轴上的刻度和标签

numpy是如何添加@运算符的?

机器学习实验笔记本的工作区 url

无法在 Windows Python 3.5 上安装 Levenshtein 距离包

如何注释一个以另一个函数作为参数的函数?

Python 3:函数参数中的省略号?

如何配置 Atom 以运行 Python3 脚本?

如何使用python将放置在多个嵌套文件夹中的文档移动和重命名为一个新的单个文件夹?

python 内置的 __exit__ 参数类型是什么?

导入父目录进行简要测试

try 在 Mac OS 中运行此命令pipenv install requests时出错

如何将文档字符串放在 Enums 上?