setuptools和pip:最小和完整安装的选择

时间:2013-09-30 13:58:45

标签: python pip setuptools

我们建立了一个依赖于其他库的库。但是有必要(例如对于服务器批处理)和可选的依赖(例如对于具有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
)

2 个答案:

答案 0 :(得分:22)

您可以在extras_require中安装软件包,方法是将方括号中的推荐依赖项名称(例如[mpl][bn])附加到pip中的软件包名称。 / p>

所以要安装带有附加要求的'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值)

答案 1 :(得分: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服务器解决这个问题,但这有点超出了范围。