安装已使用的命名空间包的依赖项

时间:2020-06-29 12:01:02

标签: pip setuptools setup.py python-packaging

假设我具有以下软件包结构:

package/
    mynamespace-subpackage-a/
        setup.py
        mynamespace/
            subpackage_a/
                __init__.py

    mynamespace-subpackage-b/
        setup.py
        mynamespace/
            subpackage_b/
                __init__.py
            module_b.py

在包a中带有setup.py:

from setuptools import find_packages, setup

setup(
    name='mynamespace-subpackage-a',
    ...
    packages=find_packages(),
    namespace_packages=['mynamespace'],
    install_requires=['pandas']
)

并打包b:

from setuptools import find_packages, setup

setup(
    name='mynamespace-subpackage-b',
    ...
    packages=find_packages(),
    namespace_packages=['mynamespace'],
    install_requires=[]
)

程序包b使用程序包a,但它没有对pandas库本身的任何引用。因此,它未在install_requires中列出,但是当在软件包b内执行pip install .且仍应将软件包a打包时,仍应安装该软件包。

应该在第二个setup文件中添加什么来实现,这甚至可能吗?还是pandas也应该在软件包b的需求列表中?

我会怀疑类似的东西

install_requires = ['mynamespace.subpackage_a`]

1 个答案:

答案 0 :(得分:1)

根据我对问题的了解,我认为应该是:

package/mynamespace-subpackage-b/setup.py

#...
setup(
    name='mynamespace-subpackage-b',
    # ...
    install_requires=[
        'mynamespace-subpackage-a',
        # ...
    ],
)

这显然是假设在安装a时可以找到b pip ,这意味着a的发行版应该发布在某种索引上(例如例如PyPI)。如果不可能,那么以下替代方法之一可能会有所帮助:

  • ab的分布( wheel source分布)放置在本地目录中,然后使用 pip --find-links选项(doc):pip install --find-links=path/to/distributions mynamespace-subpackage-b

  • 使用direct reference file URL as seen in PEP 440install_requires=['a @ file:///path/to/a.whl']

  • 使用direct remote URL(例如 git 这样的 VCS 可以),URL可以指向私有存储库,也可以位于本地文件系统上: install_requires=['mynamespace-subpackage-a @ git+file:///path/to/mynamespace-subpackage-a@master'],这假定setup.py位于存储库的根目录。