17

我们创建了一个依赖于其他库的库。但是有必要的(例如对于服务器批处理)和可选的依赖项(例如对于具有 GUI 的客户端)。

这样的事情可能吗:

pip install mylib.tar.gz  # automatically downloads and installs with the minimal set of dependencies

pip install mylib.tar.gz  --install-option="complete"  # automatically installs with all dependencies

我找到了extra_require旗帜,但我怎么知道pip要使用它们呢?setup.py看起来像这样:

from setuptools import setup

# ...

# Hard library depencencies:
requires = [
    "numpy>=1.4.1",
    "scipy>=0.7.2",
    "traits>=3.4.0"
]

# Soft library dependencies:
recommended = {
    "mpl": ["matplotlib>=0.99.3"],
    "bn": ["bottleneck>=0.6"]
}

# ...

# Installer parameters:
setup(
    name = "mylib",
    #...
    install_requires = requires,
    extras_require = recommended
)
4

2 回答 2

22

您可以extras_require通过将方括号中推荐的依赖项的名称(即[mpl][bn]根据您的情况)附加到 pip 中的包名称来安装包。

因此,要安装具有附加要求的“mylib”,您可以像这样调用 pip:

pip install 'mylib[mpl]'
pip install 'mylib[bn]'

这将首先下载并安装额外的依赖项,然后mylib是核心依赖项。

这与您使用 setuptools 声明这些依赖项的方式类似:http://pythonhosted.org/setuptools/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies 参见install_requires第三个示例中的值)

于 2013-09-30T14:27:55.570 回答
10

所以 pip 实际上对安装有额外要求的库非常挑剔

pip install -e ".[extra,requirements]"    # works with file paths
pip install "package[extra,requirements]" # works when downloading packages
pip install ".[extra,requirments]"        # DOES NOT WORK

我认为这取决于 RequirementsSpec 解析器的工作方式,并且 pip 对-e标志做了一些额外的魔法。无论如何,经过多次头部撞击,这是一个有点丑陋的解决方法

pip install "file:///path/to/your/python_code#egg=SomeName[extra,requirements]"

egg=SomeName部分基本上被忽略了,但 pip 正确地提取了额外的要求

注意事项

  • 使用 pip 1.5.6 进行测试,因此请确保您使用的是当前版本的 pip。
  • 据我所知,file:///pip 中没有记录语法,所以我不确定它将来是否会改变。它看起来有点像VCS Support语法,但我有点惊讶它的工作原理。
  • 您也可以通过运行自己的 pypi 服务器来解决这个问题,但这有点超出范围。
于 2014-10-09T17:58:49.840 回答