告诉pip安装需求文件中列出的软件包的依赖项

时间:2012-04-26 12:52:45

标签: python pip requirements.txt

开发一个Django Web应用程序,我有一个我需要在virtualenv中安装的软件包列表。说:

Django==1.3.1
--extra-index-url=http://dist.pinaxproject.com/dev/
Pinax==0.9b1.dev10
git+git://github.com/pinax/pinax-theme-bootstrap.git@cff4f5bbe9f87f0c67ee9ada9aa8ae82978f9890
# and other packages

最初我在开发过程中一个接一个地手动安装它们。这安装了所需的依赖项,最后在部署应用程序之前使用了pip freeze

问题是,当我升级某些软件包时,不再使用或不需要某些依赖项,但它们仍然由pip freeze列出。

现在,我想以这种方式建立一个新的virtualenv:

  • 将所需的包(没有它们的依赖项)放在需求文件中,
    manual-requirements.txt
  • 安装它们的依赖项
    pip install -r manual-requirement.txt(←问题,这不会安装依赖项)
  • 冻结完整的virtualenv
    pip freeze -r manual-requirements.txt > full-requirements.txt
    并部署。

如果不在新的virtualenv中手动重新安装软件包来获取它们的依赖关系,是否可以这样做?这很容易出错,我希望自动化从不再需要的旧依赖项中清除virtualenv的过程。

编辑实际上,即使the documentation告诉我们此类文件是平的,pip 也会安装未明确列在需求文件中的依赖项。关于我希望安装哪些依赖项我错了。我会让这个问题让任​​何人对pip没有安装所有依赖项有疑问。

5 个答案:

答案 0 :(得分:47)

简单地说,使用:

pip install -r requirement.txt

它可以安装在需求文件中列出的所有内容。

答案 1 :(得分:24)

  

如果不在新的virtualenv中手动重新安装软件包来获取它们的依赖关系,是否可以这样做?这很容易出错,我希望自动化从不再需要的旧依赖项中清除virtualenv的过程。

pip-tools 包的用途(来自https://github.com/nvie/pip-tools):

安装

$ pip install --upgrade pip  # pip-tools needs pip==6.1 or higher (!)
$ pip install pip-tools

pip-compile的示例用法

假设您有一个Flask项目,并希望将其固定用于生产。将以下行写入文件:

# requirements.in
Flask

现在,运行pip-compile requirements.in:

$ pip-compile requirements.in
#
# This file is autogenerated by pip-compile
# Make changes in requirements.in, then run this to update:
#
#    pip-compile requirements.in
#
flask==0.10.1
itsdangerous==0.24        # via flask
jinja2==2.7.3             # via flask
markupsafe==0.23          # via jinja2
werkzeug==0.10.4          # via flask

它将产生你的requirements.txt,并固定所有Flask依赖项(和所有底层依赖项)。也将此文件置于版本控制之下,并定期重新运行pip-compile以更新软件包。

pip-sync的示例用法

现在您已拥有requirements.txt,您可以使用pip-sync更新虚拟环境,以准确反映其中的内容。注意:这将安装/升级/卸载匹配requirements.txt内容所需的所有内容。

$ pip-sync
Uninstalling flake8-2.4.1:
  Successfully uninstalled flake8-2.4.1
Collecting click==4.1
  Downloading click-4.1-py2.py3-none-any.whl (62kB)
    100% |████████████████████████████████| 65kB 1.8MB/s
  Found existing installation: click 4.0
    Uninstalling click-4.0:
      Successfully uninstalled click-4.0
Successfully installed click-4.1

答案 2 :(得分:15)

鉴于您对该问题的评论(您说单个包的执行安装按预期工作),我建议循环您的需求文件。在bash:

#!/bin/sh
while read p; do
  pip install $p
done < requirements.pip

HTH!

答案 3 :(得分:0)

扩展Piotr的答案,如果您还需要一种方法确定要放入requirements.in的内容,则可以首先使用pip-chill to find the minimal set of required packages you have。通过组合这些工具,可以显示每个软件包安装的依赖原因。整个周期如下所示:

  1. 创建虚拟环境:
    $ python3 -m venv venv
  2. 激活它:
    $ . venv/bin/activate
  3. 安装最新版本的pip,pip-tools和pip-chill:
    (venv)$ pip install --upgrade pip
    (venv)$ pip install pip-tools pip-chill
  4. 构建您的项目,安装更多pip包等,直到您想要保存...
  5. 提取最少的软件包集(即没有依赖项的顶级软件包):
    (venv)$ pip-chill --no-version > requirements.in
  6. 编译所有必需软件包的列表(显示依赖性原因):
    (venv)$ pip-compile requirements.in
  7. 确保当前安装与列表同步:
    (venv)$ pip-sync

答案 4 :(得分:0)

这是一个简单的解决方案:

while read -r package; do pip install --upgrade --force-reinstall $package;done < pipfreeze.txt
相关问题