1

从 python 3.3 开始,支持隐式命名空间包,所以我可以有两个包:

a
├── b
    ├── __init__.py

a
├── c
    ├── __init__.py

和进口a.ba.c没有问题。但似乎我只能用pip install; 如果我只创建任一包的 egg 并将 egg 路径添加到sys.path,则无法加载模块:

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

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

1 回答 1

0

创建命名空间包的三种方法:

  1. 本机命名空间包
  2. pkgutil 风格的命名空间包
  3. pkg_resources 风格的命名空间包

前两个不是拉链安全的,这就是鸡蛋不起作用的原因。第三个是拉链安全的。

基本上,__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']
)
于 2022-01-27T10:07:43.937 回答