具有核心部分的命名空间包?

jbe*_*net 9 python setuptools namespace-package

这个问题跟进在Python中创建命名空间包的方法以及如何在Python中创建命名空间包?.

注意PEP 420分发文档,其中说明:

您不能在命名空间包中包含任何其他代码和数据__init__.py.尽管它可能在开发期间或项目作为.egg文件安装时起作用,但在使用"系统"打包工具安装项目时它将无法工作 - 在这种情况下,__init__.py文件将不会被安装,更不用说执行了.


这似乎使得无法拥有一个带有独立分布式扩展子包的"主库"包.我想要的是能够:

  1. 定义一个核心库包,使用如下:

    import mylibrary
    
    mylibrary.some_function()
    
    Run Code Online (Sandbox Code Playgroud)
  2. 允许库扩展,单独打包和分发,使用如下:

    import mylibrary.myextension
    
    mylibrary.myextension.some_other_function()
    
    Run Code Online (Sandbox Code Playgroud)

我希望能够使用命名空间包来实现这一点,但基于上面的问题和链接,似乎并非如此.这可以完成吗?

小智 4

确实不可能在__init__.pyPEP 420 命名空间包的顶层包含代码。

如果我是你,我会:

  1. 创建 2 个包,一个称为 mylibrary(普通包),其中包含实际的库代码,另一个称为 mylibrary_plugins,它是一个命名空间包。
  2. 或者,创建 mylibrary.lib(这是一个普通包并包含您的代码)和 mylibrary.plugins(这是一个命名空间包)。

我个人会使用选项 1。

PEP 420 的基本原理部分解释了为什么__init__.py不能包含任何代码。