【问题标题】:Python namespace sub-package depending on another sub-package fails to installPython命名空间子包依赖另一个子包安装失败
【发布时间】:2018-11-24 15:02:31
【问题描述】:

我的目标是创建一个包含两个子包的命名空间包:foo 和 bar(依赖于 foo),并将命名空间包推送到 git repo(不将其发布到 PyPI),以便我可以安装任何一个子包带有 repo url 的包。

我正在关注this tutorial 创建命名空间结构:

root/
 ├ setup.py
 └ microlibs/
    ├ foo/
    │  ├ setup.py
    │  ├ macrolib/
    │     └ foo/
    │        ├ __init__.py
    │        ├ module1.py
    │        ├ ...
    │        └ moduleN.py
    .
    .
    .
    └ bar/
       ├ setup.py
       ├ macrolib/
          └ bar/
             ├ __init__.py
             ├ module1.py
             ├ ...
             └ moduleN.py

foo的setup.py文件没有依赖:

foo/setup.py

from setuptools import setup
microlib_name = 'macrolib.foo'
setup(
    name=microlib_name,
    version="0.1.0",
    namespace_packages=['macrolib'],
    packages=[microlib_name],
    install_requires=[]
)

由于bar的依赖包括foo,所以bar的setup.py在install_requires列表中包含macrolib.bar:

bar/setup.py

from setuptools import setup
microlib_name = 'macrolib.bar'
setup(
    name=microlib_name,
    version="0.1.0",
    namespace_packages=['macrolib'],
    packages=[microlib_name],
    install_requires=[
        'macrolib.foo'
    ]
)

推送到bitbucket repo后,我可以安装macrolib.foo,而repo的子目录没有问题。

$ pip install git+http://path/to/repo.git@<branch name>#"subdirectory=foo&egg=macrolib.foo"

安装了macrolib.foo 后,我还可以安装macrolib.bar 而不会出现repo 的子目录问题。

$ pip install git+http://path/to/repo.git@<branch name>#"subdirectory=bar&egg=macrolib.bar"

但是,如果我不先安装 macrolib.foo 就尝试安装 macrolib.bar,安装失败。

$ pip install git+http://path/to/repo.git@<branch name>#"subdirectory=bar&egg=macrolib.bar"

错误:

Collecting macrolib.foo (from macrolib.bar==0.1.0)
  Could not find a version that satisfies the requirement macrolib.foo (from macrolib.bar==0.1.0) (from versions: )
No matching distribution found for macrolib.foo (from macrolib.bar==0.1.0)

我猜这是因为 bar/setup.py 中缺少 dependency_links。所以我尝试了不同的链接 url 组合,都失败了同样的错误。

我尝试过的格式:

dependency_links=['http://path/to/repo.git@<branch name>#"subdirectory=foo&egg=macrolib.foo"']

dependency_links=['http://path/to/repo.git@<branch name>#subdirectory=foo&egg=macrolib.foo']

dependency_links=['http://path/to/repo/tarball/<branch name>#"subdirectory=foo&egg=macrolib.foo"']

dependency_links=['http://path/to/repo/tarball/<branch name>#subdirectory=foo&egg=macrolib.foo']

dependency_links=['http://path/to/repo/archive/<branch name>.zip#"subdirectory=foo&egg=macrolib.foo"']

dependency_links=['http://path/to/repo/archive/<branch name>.zip#subdirectory=foo&egg=macrolib.foo']

或在上述所有网址中添加前缀“git+”。

我的问题是,为了将 macrolib.foo 作为依赖项安装,dependency_links 的正确 url 格式是什么,或者有其他方法可以使它工作吗?

【问题讨论】:

    标签: python git pip setuptools


    【解决方案1】:

    这是正确的格式(添加 'git+' 和依赖版本):

    dependency_links=['git+http://path/to/repo.git@<branch name>#subdirectory=foo&egg=macrolib.foo-0.1.0']
    

    你需要让pip处理它:

    pip install --process-dependency-links git+http://path/to/repo.git@<branch name>#"subdirectory=bar&egg=macrolib.bar"
    

    【讨论】:

    • 谢谢。添加--process-dependency-links确实使解决方案更近了一步,但由于无法识别的链接格式,它仍然会导致相同的错误。我刚刚发现添加git+ 和“依赖版本”使其正确。我稍微编辑了答案,以便可以接受。
    • 我还有一个问题。我可以看到许多其他人使用 tarball/ 作为dependency_link,例如this one。为什么 .git 链接也有效?
    • 因为pip可以在克隆的工作树中运行svn/hg/git clonepython setup.py install
    猜你喜欢
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2021-08-09
    • 2021-06-21
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多