检查要求是否是最新的

时间:2014-04-08 18:06:05

标签: python package pip pypi requirements.txt

我使用pip requirements files来保留我的依赖列表。

我还尝试遵循管理依赖项的最佳实践,并在需求文件中提供精确的包版本。例如:

Django==1.5.1
lxml==3.0

问题是:有没有办法告诉我们requirements.txt中列出的软件包的Python软件包索引中是否有更新的软件包版本?

对于这个特殊的例子,目前最新的版本分别是Django和lxml的1.6.2和3.3.4。

我已尝试pip install --upgrade -r requirements.txt,但它说所有内容都是最新的:

$ pip install --upgrade -r requirements.txt 
Requirement already up-to-date: Django==1.5.1 ...

请注意,此时我不想进行实际升级 - 我只想查看是否有可用的更新。

4 个答案:

答案 0 :(得分:89)

Pip内置了此功能。假设你在virtualenv类型中:

$ pip list --outdated
psycopg2 (Current: 2.5.1 Latest: 2.5.2)
requests (Current: 2.2.0 Latest: 2.2.1)

$ pip install -U psycopg2 requests

之后将下载并安装新版本的psycopg2和请求。然后:

$ pip freeze > requirements.txt

你完成了。这不是一个命令,但优点是您不需要任何外部依赖项。

答案 1 :(得分:30)

刚刚找到一个专门用于任务的python包 - piprot,其中包含以下口号:

How rotten are your requirements?

使用起来非常简单:

$ piprot requirements.txt 
Django (1.5.1) is 315 days out of date. Latest is 1.6.2
lxml (3.0) is 542 days out of date. Latest is 3.3.4
Your requirements are 857 days out of date

此外,您可以“管道”pip freezepiprot命令,因此它实际上可以检查沙箱/虚拟环境中安装的软件包的烂程度:

pip freeze | piprot

希望将来会帮助某人。

答案 2 :(得分:9)

既然你提到你喜欢遵循最佳实践,我猜你也在使用virtualenv,对吗?假设是这种情况,并且由于您已经pinning了您的软件包,因此有一个名为pip-tools的工具可以针对您的virtualenv运行以检查更新。

有一个不好的方面,为什么我提到使用virtualenv。

  

[该工具]检查PyPI并报告可用更新。它使用的列表   当前安装的软件包用于检查更新,它不使用任何软件包   requirements.txt

如果您在virtualenv中运行它,您可以轻松查看哪些软件包具有适用于您当前活动环境的更新。但是,如果你没有使用virtualenv,它可能不是最好对系统运行它,因为你的其他项目可能依赖于不同的版本(或者即使它们目前都在工作,也可能不适用于更新版本)。

从提供的文档中,使用很简单。 pip-review会向您显示可用的更新,但不会安装它们。

$ pip-review
requests==0.13.4 available (you have 0.13.2)
redis==2.4.13 available (you have 2.4.9)
rq==0.3.2 available (you have 0.3.0)

如果您也想自动安装,该工具也可以处理:$ pip-review --auto。还有一个--interactive开关,您可以使用它来有选择地更新包。

完成所有这些操作后,pip-tools提供了使用最新版本pip-dump更新requirements.txt的方法。同样,这是针对当前活动的环境运行的,因此建议在virtualenv中使用。

项目的安装可以通过pip install pip-tools完成。

作者注:我已经将它用于小型Django项目,并对此非常满意。但请注意,如果您在虚拟环境中安装pip-tools,则在运行pip-dump时,您会发现它已添加到您的requirements.txt文件中。由于我的项目很小,我总是只是手动删除该行。如果您有某种构建脚本,则可能需要在部署之前自动将其删除。

答案 3 :(得分:5)

你可以在env(虚拟或非虚拟)中简单地做这样的事情:

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'