如何在可编辑模式下安装多个 python 命名空间包
How to install multiple python namespace packages in editable mode
我按照PEP420隐式命名空间打包方式创建了多个包。其中两个分发包是 dende-github-api
和 dende-gitlab-api
。这些发行版中的每一个都包含一个模块,我希望可以在 dende.api
命名空间下访问该模块。可以在此处找到一个最小的 working 示例:https://github.com/dende/example-monorepositry
这是包含两个发行版的存储库的文件夹结构:
example-monorepository
├── dende-github-api
│ ├── dende
│ │ └── api
│ │ ├── github.py
│ │ └── __init__.py
│ └── setup.py
├── dende-gitlab-api
│ ├── dende
│ │ └── api
│ │ ├── gitlab.py
│ │ └── __init__.py
│ └── setup.py
├── requirements.dev.txt
└── requirements.txt
setup.py
看起来像这样(只显示 dende-github-api):
from setuptools import setup
setup(
name='dende-github-api',
packages=['dende.api'],
install_requires=[
'PyGithub'
]
)
我可以安装这两个发行版并正常使用它们:
$ pip install ./dende-github-api
$ pip install ./dende-gitlab-api
$ python -m dende.api.github
Hi from dende-github-api from /home/c/git/example-monorepositry/venv/lib/python3.8/site-packages/dende/api/github.py
$ python -m dende.api.gitlab
Hi from dende-gitlab-api from /home/c/git/example-monorepositry/venv/lib/python3.8/site-packages/dende/api/gitlab.py
当我以可编辑模式安装两个发行版时,只有一个安装有效:
$ pip install -e ./dende-github-api
$ pip install -e ./dende-gitlab-api
python -m dende.api.gitlab
Hi from dende-gitlab-api from /home/c/git/example-monorepositry/venv/lib/python3.8/site-packages/dende/api/gitlab.py
python -m dende.api.github
/home/c/git/example-monorepositry/venv/bin/python: No module named dende.api.github
不知何故,第二个安装似乎隐藏了重叠命名空间中旧发行版的安装。是否可以在可编辑模式下安装像这样的重叠包?
我认为你做不到。可编辑安装通过在 site-packages/
中创建一个指向源目录的文件 <package_name>.egg-link
来工作。您可能只有 1(一个)这样的 link,因此您只能在 develop/editable 模式下安装一个名为 <package_name>
的包(即使它是命名空间包)。
见https://setuptools.readthedocs.io/en/latest/userguide/development_mode.html
您的两个模块都在常规包 dende.api
中,因为它们都包含一个 __init__.py
。因此,它们实际上并不在隐式名称空间包中。两个 dende.api
中只有一个可用。
它在以不可编辑模式安装它们时只是偶然地起作用,因为文件被写入磁盘上的同一目录,但不是因为命名空间包机制。
您可以通过删除 __init__.py
来修复它,从而使 dende.api
成为命名空间包,或者将两个 api
重命名为不同的包 github-api
和 gitlab-api
,它们都在命名空间包 dende
.
中
关于某种相关问题的命名空间包机制的更详细解释(为什么在常规包中包含命名空间包意义不大)可在此处找到:
我按照PEP420隐式命名空间打包方式创建了多个包。其中两个分发包是 dende-github-api
和 dende-gitlab-api
。这些发行版中的每一个都包含一个模块,我希望可以在 dende.api
命名空间下访问该模块。可以在此处找到一个最小的 working 示例:https://github.com/dende/example-monorepositry
这是包含两个发行版的存储库的文件夹结构:
example-monorepository
├── dende-github-api
│ ├── dende
│ │ └── api
│ │ ├── github.py
│ │ └── __init__.py
│ └── setup.py
├── dende-gitlab-api
│ ├── dende
│ │ └── api
│ │ ├── gitlab.py
│ │ └── __init__.py
│ └── setup.py
├── requirements.dev.txt
└── requirements.txt
setup.py
看起来像这样(只显示 dende-github-api):
from setuptools import setup
setup(
name='dende-github-api',
packages=['dende.api'],
install_requires=[
'PyGithub'
]
)
我可以安装这两个发行版并正常使用它们:
$ pip install ./dende-github-api
$ pip install ./dende-gitlab-api
$ python -m dende.api.github
Hi from dende-github-api from /home/c/git/example-monorepositry/venv/lib/python3.8/site-packages/dende/api/github.py
$ python -m dende.api.gitlab
Hi from dende-gitlab-api from /home/c/git/example-monorepositry/venv/lib/python3.8/site-packages/dende/api/gitlab.py
当我以可编辑模式安装两个发行版时,只有一个安装有效:
$ pip install -e ./dende-github-api
$ pip install -e ./dende-gitlab-api
python -m dende.api.gitlab
Hi from dende-gitlab-api from /home/c/git/example-monorepositry/venv/lib/python3.8/site-packages/dende/api/gitlab.py
python -m dende.api.github
/home/c/git/example-monorepositry/venv/bin/python: No module named dende.api.github
不知何故,第二个安装似乎隐藏了重叠命名空间中旧发行版的安装。是否可以在可编辑模式下安装像这样的重叠包?
我认为你做不到。可编辑安装通过在 site-packages/
中创建一个指向源目录的文件 <package_name>.egg-link
来工作。您可能只有 1(一个)这样的 link,因此您只能在 develop/editable 模式下安装一个名为 <package_name>
的包(即使它是命名空间包)。
见https://setuptools.readthedocs.io/en/latest/userguide/development_mode.html
您的两个模块都在常规包 dende.api
中,因为它们都包含一个 __init__.py
。因此,它们实际上并不在隐式名称空间包中。两个 dende.api
中只有一个可用。
它在以不可编辑模式安装它们时只是偶然地起作用,因为文件被写入磁盘上的同一目录,但不是因为命名空间包机制。
您可以通过删除 __init__.py
来修复它,从而使 dende.api
成为命名空间包,或者将两个 api
重命名为不同的包 github-api
和 gitlab-api
,它们都在命名空间包 dende
.
关于某种相关问题的命名空间包机制的更详细解释(为什么在常规包中包含命名空间包意义不大)可在此处找到: