如何通过将包 egg 添加到 sys.path 来加载隐式命名空间包?

How to load implicit namespace package by adding the package egg to sys.path?

自从python 3.3 支持implicit namespace packages,所以我可以有两个包:

a
├── b
    ├── __init__.py

a
├── c
    ├── __init__.py

并导入 a.ba.c 没有问题。但是好像只能用pip install;如果我只创建一个包的蛋并将蛋路径添加到sys.path,则无法加载模块:

import sys
sys.path.append('./a-b.egg')

import a.b # ModuleNotFoundError: No module named 'a.b'

three ways个可以创建命名空间包:

  1. 本机命名空间包
  2. pkgutil-style 命名空间包
  3. pkg_resources-style 命名空间包

前两个不是zip-safe,这就是彩蛋不起作用的原因。第三个是zip-safe.

基本上,命名空间包的 __init__.py 文件只需要包含以下内容:

__import__('pkg_resources').declare_namespace(__name__)

并且每个发行版都必须在 setup.py:

中为 setup() 提供 namespace_packages 参数
from setuptools import find_packages, setup

setup(
    name='mynamespace-subpackage-a',
    ...
    packages=find_packages()
    namespace_packages=['mynamespace']
)