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

72

我正在开发一个Django网站应用,我有一个需要在虚拟环境中安装的包列表。例如:

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列出。

现在,我想这样设置新的虚拟环境:

  • 将所需的软件包(不包括它们的依赖项)放入要求文件中,
    例如manual-requirements.txt
  • 安装它们和它们的依赖项
    pip install -r manual-requirement.txt (←问题,这不安装依赖关系)
  • 冻结完整的虚拟环境
    pip freeze -r manual-requirements.txt > full-requirements.txt
    并部署。

是否有任何方法可以无需手动在新虚拟环境中重新安装软件包以获取其依赖关系? 这将存在错误风险,而我希望自动化清理虚拟环境中不再需要的旧依赖项的过程。

编辑:实际上,pip确实安装未在要求文件中显式列出的依赖项,即使文档告诉我们这样的文件是平面的。 我对期望安装的依赖关系有所错误。 我将此问题留给怀疑pip是否安装所有依赖项的任何人。


1
那么...问题到底是什么?你知道哪些是你的“一级”依赖关系吗? - mac
是的,我已经在manual-requirements.txt中列出了它们。问题是:如果我使用要求文件,pip不会安装它们的依赖项(即“第二级”),而如果我手动执行pip install django; pip install pinax;等操作,则会安装它们。 - Maxime R.
只要您使用所需软件包的确切版本,其依赖关系就不会发生变化。但是,如果您不使用确切的版本,如何保证您的应用程序仍然正常工作呢? - newtover
我知道,最终我会使用精确的版本进行测试和部署。我的问题涉及在一些“第一级”依赖项升级后不再需要的“第二级”依赖项。我想从头开始重建完整的依赖列表,以删除不再需要的内容并避免任何冲突。 - Maxime R.
由于您标记为“已接受”的@mac的答案不正确,也许现在是重新评估的时候了? - Piotr Dobrogost
请更新文档链接,亲爱的链接已经失效了。 - John Vandivier
6个回答

70

只需使用:

pip install -r requirements.txt

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


48
由于 OP 明显知道 pip install -r (...) 的含义,我不知道这个回答是何意... - Piotr Dobrogost
对于其他人来说。 - steffen

35

有没有不用手动在新的虚拟环境中重新安装软件包以获取它们的依赖关系的方法? 这样容易出错,我想自动化清理虚拟环境中不再需要的旧依赖项的过程。

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

使用pip-compile会生成你的requirements.txt文件,其中包含所有Flask依赖项(以及所有底层依赖项)的版本号。将此文件纳入版本控制,并定期重新运行pip-compile以更新软件包。

pip-sync的使用示例

现在,您可以使用pip-sync根据requirements.txt精确地更新虚拟环境。注意:这将安装/升级/卸载所有必要的内容以匹配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

29

根据您在问题评论中的说法(其中您表示执行单个软件包的安装按预期工作),我建议您循环处理需求文件。在bash中:

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

祝好运!


没错,这比仅使用pip尝试实现要快得多。看起来它并没有解决我的问题,事实上,从一个需求文件中安装pip确实会安装未列出的依赖项(这是令人放心的),但它让我发现我的“第一级”依赖项列表不完整:我使用的其中一个包没有列出任何依赖项,而是有一个需求文件,我上个月用它来设置虚拟环境。pip无法知道这一点,而我也忘记了它:我的错。对此我深表歉意,但还是感谢您的支持! - Maxime R.

7

扩展Piotr的回答,如果你需要找到在 requirements.in 中放置什么的方法,可以首先使用pip-chill 来找到你所需的最小化软件包集合。通过结合这些工具,你可以显示每个软件包被安装的依赖原因。完整的流程如下:

  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

正如 @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

0
pip freeze命令无法识别您的虚拟环境。
尝试退出并重新输入该命令。
C:\Users\зс\PycharmProjects\path_user\my_venv\Scripts >deactivate

然后在同一个文件夹中再次激活它:
C:\Users\зс\PycharmProjects\path_user\my_venv\Scripts >activate

然后在项目的根目录下,将pip freeze的依赖项冻结到requirements.txt文件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接