45

我有一个带有 setup.py 和extras_requires行的包“A”,例如:

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

还有一个依赖于 util 的包“B”:

install_requires = ['A[ssh]']

如果我在引擎盖下python setup.py install使用的包 B 上运行,则正确解析并安装了 paramiko。setuptools.command.easy_installextras_requires

但是,如果我运行pip /path/to/Bor pip hxxp://.../b-version.tar.gz,则安装包 A,但未安装 paramiko。

因为 pip “从源代码安装”,我不太确定为什么这不起作用。它应该调用 B 的 setup.py,然后解析和安装 B 和 A 的依赖项。

这可以用 pip 吗?

4

3 回答 3

39

我们使用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
于 2013-09-18T18:07:34.047 回答
21

自 2012 年 2 月发布的 pip 1.1 起支持这一点(在提出此问题一年后)。

于 2011-01-26T15:38:05.500 回答
17

@aaronfay 的答案是完全正确的,但最好指出如果您使用zsh的是 install 命令,则pip install -e .[dev]需要将其替换为pip install -e ".[dev]".

于 2019-03-08T13:05:05.160 回答