【问题标题】:tell pip to install the dependencies of packages listed in a requirement file告诉 pip 安装需求文件中列出的包的依赖项
【发布时间】:2012-05-07 05:00:59
【问题描述】:

开发 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 的过程。

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

【问题讨论】:

  • 那么...到底是什么问题?你知道哪些是你的“第一级”依赖吗?
  • 是的,我已经在 manual-requirements.txt 中列出了它们。问题是:如果我在手动安装它们时使用需求文件,则 pip 不会安装它们的依赖项(即“二级”)pip install django; pip install pinax; etc.
  • 只要你使用所需包的确切版本,它的依赖项应该没有变化。但是如果你不使用确切的版本,你怎么能保证你的应用仍然可以工作呢?
  • 我知道,我最终会使用精确的版本进行测试和部署。我的问题涉及对我的“第一级”依赖项进行一些升级后不再需要的“第二级”依赖项。我想从头开始重建完整的部门列表,以删除不再需要的内容并避免任何冲突。
  • 由于您标记为 已接受 的@mac 的答案不正确,也许是时候重新评估了?

标签: python pip requirements.txt


【解决方案1】:

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

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

HTH!

【讨论】:

  • 对,这比尝试仅使用 pip 实现这一目标要快得多。似乎它没有解决我的问题,事实上,从需求文件安装 pip does 安装未列出的依赖项(这令人放心)但它让我发现我的“第一级”依赖项列表不完整:我使用的其中一个包没有任何列出的依赖项,而是有一个我上个月用来设置 virtualenv 的需求文件。 pip 无法知道这一点,我也忘记了:我的错。很抱歉,但感谢您的支持!
  • @MaximeR。不用担心,感谢您接受答案! :)
【解决方案2】:

简单使用:

pip install -r requirements.txt

这会安装 requirements.txt 文件中列出的所有依赖项。

【讨论】:

  • 正如 OP 清楚地知道 pip install -r (...) 我不知道这应该回答什么......
【解决方案3】:

有什么方法可以做到这一点,而无需在新的 virtualenv 中手动重新安装包以获取它们的依赖项?这很容易出错,我想自动化从不再需要的旧依赖项中清除 virtualenv 的过程。

这就是 pip-tools 包的用途(来自https://github.com/jazzband/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

【讨论】:

    【解决方案4】:

    扩展 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 &gt; requirements.in
    6. 编译所有必需包的列表(显示依赖原因):
      (venv)$ pip-compile requirements.in
    7. 确保当前安装与列表同步:
      (venv)$ pip-sync

    【讨论】:

      【解决方案5】:

      正如@Ming 所说:

      pip install -r file.txt
      

      这是强制更新所有依赖项的简单行:

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

      pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        • 2011-06-27
        • 2012-12-19
        • 2011-04-09
        • 2011-11-12
        • 2016-08-26
        相关资源
        最近更新 更多