【问题标题】:How to install multiple python namespace packages in editable mode如何在可编辑模式下安装多个 python 命名空间包
【发布时间】:2021-02-23 15:04:56
【问题描述】:

我根据PEP420隐式命名空间打包方式创建了多个包。其中两个分发包是dende-github-apidende-gitlab-api。这些发行版中的每一个都包含一个模块,我希望可以在 dende.api 命名空间下访问该模块。可以在此处找到一个最小的工作示例: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

不知何故,第二次安装似乎掩盖了重叠命名空间中旧发行版的安装。是否可以在可编辑模式下安装这样的重叠包?

【问题讨论】:

  • 顺便说一句,根据PEP 420:“命名空间包不能包含 __init__.py。”你的 setup.py 都没有标记命名空间包,可以吗?

标签: python pip setuptools


【解决方案1】:

您的两个模块都在常规包dende.api 中,因为它们都包含__init__.py。因此,它们实际上并不在隐式命名空间包中。两个dende.apis 中只有一个可用。

它在以不可编辑模式安装它们时只是偶然的,因为文件被写入磁盘上的同一目录,但不是因为命名空间包机制。

您可以通过删除__init__.pys 从而使dende.api 成为命名空间包或将两个apis 重命名为不同的包github-apigitlab-api 来修复它,然后它们都在命名空间中包dende.

可以在此处找到有关某种相关问题的命名空间包机制的更详细说明(为什么将命名空间包放在常规包中几乎没有意义):https://stackoverflow.com/a/62992832

【讨论】:

    【解决方案2】:

    我不认为你可以。可编辑安装通过在site-packages/ 中创建指向源目录的文件<package_name>.egg-link 来工作。您可能只有 1(一个)这样的链接,因此您只能在开发/可编辑模式下安装一个名为 <package_name> 的包(即使它是命名空间包)。

    https://setuptools.readthedocs.io/en/latest/userguide/development_mode.html

    【讨论】:

    • 对我来说,它使用 distribution package 的名称创建鸡蛋链接,而不是使用包含的包的名称:它为我创建 dende-github-api.egg-linkdende-gitlab-api.egg-link
    猜你喜欢
    • 2020-01-20
    • 1970-01-01
    • 2021-12-11
    • 2015-01-18
    • 2021-06-25
    • 2015-05-21
    • 1970-01-01
    • 2021-08-13
    • 2018-11-24
    相关资源
    最近更新 更多