如何通过将包 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.b
和 a.c
没有问题。但是好像只能用pip install
;如果我只创建一个包的蛋并将蛋路径添加到sys.path
,则无法加载模块:
import sys
sys.path.append('./a-b.egg')
import a.b # ModuleNotFoundError: No module named 'a.b'
有three ways个可以创建命名空间包:
- 本机命名空间包
- pkgutil-style 命名空间包
- 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']
)
自从python 3.3 支持implicit namespace packages,所以我可以有两个包:
a
├── b
├── __init__.py
a
├── c
├── __init__.py
并导入 a.b
和 a.c
没有问题。但是好像只能用pip install
;如果我只创建一个包的蛋并将蛋路径添加到sys.path
,则无法加载模块:
import sys
sys.path.append('./a-b.egg')
import a.b # ModuleNotFoundError: No module named 'a.b'
有three ways个可以创建命名空间包:
- 本机命名空间包
- pkgutil-style 命名空间包
- 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']
)