pip 是否支持来自 setuptools/distribute 的 extras_requires?

48 投票
3 回答
25524 浏览
提问于 2025-04-16 10:36

我有一个叫做“A”的包,它里面有一个setup.py文件,并且有一行叫做 extras_requires,内容如下:

extras_require = {
    'ssh':  ['paramiko'],
},

还有一个叫做“B”的包,它依赖于util:

install_requires = ['A[ssh]']

当我在包B的目录下运行 python setup.py install 时,实际上是用 setuptools.command.easy_install 在后台工作,这时 extras_requires 能正确解析,paramiko 这个库也会被安装。

但是,如果我运行 pip /path/to/B 或者 pip hxxp://.../b-version.tar.gz,包A会被安装,但 paramiko 却没有被安装。

因为 pip 是“从源代码安装”的,我不太明白为什么会出现这个问题。它应该是先调用包B的setup.py,然后解析并安装包B和包A的依赖。

用pip这样做可能吗?

3 个回答

22

@aaronfay 的回答是完全正确的,但我想补充一点,如果你使用的是 zsh 这个命令行工具,那么安装命令 pip install -e .[dev] 需要改成 pip install -e ".[dev]"

43

我们使用 setup.pypip 来管理我们包的开发依赖,不过你需要一个更新版的 pip(我们现在用的是 1.4.1)。

#!/usr/bin/env python
from setuptools import setup
from myproject import __version__ 

required = [
    'gevent',
    'flask',
    ...
]

extras = {
    'develop': [
        'Fabric',
        'nose',
    ]
}

setup(
    name="my-project",
    version=__version__,
    description="My awsome project.",
    packages=[
        "my_project"
    ],
    include_package_data=True,
    zip_safe=False,
    scripts=[
        'runmyproject',
    ],
    install_requires=required,
    extras_require=extras,
)

要安装这个包:

$ pip install -e . # only installs "required"

要进行开发:

$ pip install -e .[develop] # installs develop dependencies
22

这个功能从 pip 1.1 开始支持,那个版本是在2012年2月发布的(比这个问题提出的时间晚了一年)。

撰写回答