【问题标题】:With setuptools, when does namespace packages __init__.py files disappears?使用 setuptools,命名空间包 __init__.py 文件何时消失?
【发布时间】:2015-02-27 04:50:11
【问题描述】:

setuptools documentation 非常明确地将代码从命名空间添加到 __init__.py 文件:

您不得在命名空间包的__init__.py 中包含任何其他代码和数据。即使它在开发过程中似乎可以工作,或者当项目安装为 .egg 文件时,当使用“系统”打包工具安装项目时,它将无法工作——在这种情况下,__init__.py 文件将不会被安装,更别说被处决了。

然而,我不明白这些“系统”打包工具是什么。这些是什么?我怎样才能重现__init__.py 文件消失的这种情况?

【问题讨论】:

  • 好问题。我“系统”打包工具可能指的是 apt-getbrew 等,它们在系统范围内安装包,而与 pip 作为本地范围。

标签: python setuptools namespace-package


【解决方案1】:

@Anzel 的评论看起来是个不错的答案,我想说PEP-420 证实了这一点。在其Rationale section 中,我们读到:

命名空间包旨在支持跨多个目录拆分(因此可以通过多个sys.path 条目找到)。在此配置中,多个部分是否都提供__init__.py 文件并不重要,只要每个部分正确初始化命名空间包即可。但是,Linux 发行版供应商(以及其他)更喜欢将单独的部分组合起来,并将它们全部安装到同一个文件系统目录中。这会产生冲突的可能性,因为这些部分现在试图提供相同的目标系统上的文件 - 许多包管理器不允许这样做。允许隐式命名空间包意味着可以完全放弃提供__init__.py 文件的要求,并且可以将受影响的部分安装到公共目录中,或者根据发行版的需要拆分到多个目录中。

所以是的,我们不能再向我们的__init__.py 文件添加任何代码,因为操作系统包管理器(和其他人)更愿意将它们合并到一个目录树中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-02
    • 2017-06-11
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2014-08-16
    • 2023-03-03
    相关资源
    最近更新 更多