Python命名空间子包依赖于另一个子包无法安装

时间:2018-06-14 18:58:24

标签: python git pip setuptools

我的目标是创建一个包含两个子包的命名空间包: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文件没有依赖项:

富/ 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:

酒吧/ 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而不会出现回购的子目录。

$ 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.bar而不安装macrolib.foo,则安装失败。

$ 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。所以我尝试了不同的链接网址组合,都失败了同样的错误。

我试过的格式:

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']

或添加前缀&#39; git +&#39;以上所有网址。

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

1 个答案:

答案 0 :(得分: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"