如何使用pip和需求文件升级特定软件包?


436

我在virtualenv中为我的Django项目使用了带有需求文件的pip。我正在尝试升级某些软件包,尤其是Django本身,并且遇到有关源代码冲突的错误:

Source in `<virtualenv`>/build/Django has version 1.2.3 that conflicts with Django==1.2.4 (from -r requirements/apps.txt (line 3))

那是在我的需求文件中将Django的版本号从1.2.3更新到1.2.4之后。我正在使用此命令实际进行升级:

pip --install --upgrade -E `<virtualenv dir`> --requirement `<requirements file`>

我找不到触发总包重新下载的任何标志。我什至尝试先运行一个卸载命令,然后再运行安装程序,但没有成功。也许我缺少什么?


1
请检查@ dr-jimbob的答案,因为最新版本的pip实际上会升级您要升级的软件包所依赖的所有其他依赖项。
Lokesh Meher

Answers:


61

我不确定这是否完全是您的问题,但就我而言,我无法将Django升级到1.2.4-我总是以1.2.3版本结束,因此我使用以下方法卸载了Django:

<virtualenv>/bin/pip uninstall Django

然后,我删除了<virtualenv>/build/Django目录,最后使用以下命令安装了正确的版本:

<virtualenv>/bin/pip install Django

希望这会有所帮助。


53
这不是最佳实践。使用pip install Django -Upip install Django --upgrade在@JoeyG的答案描述。
艾哈迈德(Ahmad)'18

@艾哈迈德同意。pip和虚拟环境中应该有一个平稳的更新过程。
Parth Joshi

1270

我运行以下命令,并将其从1.2.3升级到1.4.0

pip install Django --upgrade

升级快捷方式:

pip install Django -U

注意:如果您要升级的软件包有任何要求,此命令还将把所有要求升级到可用的最新版本。在最新版本的pip中,您可以通过指定来防止此行为--upgrade-strategy only-if-needed。使用该标志,除非已安装相关软件包的版本不再满足升级软件包的要求,否则将不会升级相关软件包。


7
对我来说,这更新了我所有打包的文件,并彻底弄乱了一切!!!!文档指出:-将所有软件包升级到最新可用版本。这是正确的还是我做错了什么?
Prometheus

4
@OrbiterFleet我需要更新“请求”,所以我做了pip install Requests --upgrade只有 “请求”升级了。当我查看文档时,说明说“升级所有指定的软件包”。
哈珀维尔,2015年

31
注意,它还会更新所有依赖项,并且可能会弄乱所有内容。最好的选择是卸载并重新安装该软件包。
marcelosalloum,2015年

3
升级特定的软件包使用pip install --upgrade django==1.4.0
whale_steward 2016年

根据问题,这应该是正确的答案,或者问题本身是错误的。
int soumen

51

根据pip docs示例3

pip install --upgrade django

但根据我的经验,使用此方法也会升级与此相关的所有软件包。例:

假设您要升级somepackage,需要django >= 1.2.4使用这种方法,它也会升级somepackagedjango更新到最新的更新。为了安全起见,请执行以下操作:

# assume you want to keep django 1.2.4
pip install --upgrade somepackage django==1.2.4

这样做将升级somepackage并将Django保持为1.2.4版本


不错,但是您的解释令人困惑,因为您从使用django主包开始,然后在示例中使用somepackage,然后将其django用作依赖项。

34

的快捷命令--upgrade

pip install Django --upgrade

是:

pip install Django -U

7
如何编辑现有答案以添加此信息而不是(不完整的)答案?
6

@ a1an请提出您认为应该在“建议的编辑”中添加哪些额外信息。谢谢
Aaron Lelevier 2015年

4
我的意思是,您可以编辑JoeyG给出的答案,在此处的上下文中添加您提供的快捷方式选项。
6

17

如果升级软件包,则旧软件包将被卸载。

一种简便的方法是使用此pip-upgradeer,它还会requirements.txt为所选软件包(或所有软件包)更新文件中的版本。

安装

pip install pip-upgrader

用法

激活您的virtualenv(这很重要,因为它还将在当前virtualenv中安装新版本的升级软件包)。

cd 进入您的项目目录,然后运行:

pip-upgrade

高级用法

如果需求放置在非标准位置,请将其作为参数发送:

pip-upgrade path/to/requirements.txt

如果您已经知道要升级的软件包,只需将它们作为参数发送:

pip-upgrade -p django -p celery -p dateutil

如果需要升级到发行前/发行后版本,--prerelease请在命令中添加参数。

全面披露:我写了这个包裹。希望能帮助到你。


1
是否可以通过这种方法一次升级所有软件包(即不列出它们)?
约克一号球迷

1
@MikePalmice是:pip-upgrade -p all无需您的任何输入即可升级所有软件包并更新需求文件。
Simion Agavriloaei

15

如果只想升级一个名为的特定软件包somepackage,则应在最新版本的pip中使用的命令是

pip install --upgrade --upgrade-strategy only-if-needed somepackage

当您在django中开发的应用程序当前仅适用于django的特定版本(例如Django = 1.9.x),并且想要通过bug-fix / new功能升级某些从属软件包时,这非常有用。在django上(但可以说1.5之后的任何版本的django)。的默认行为是pip install --upgrade django-some-package将django升级到可用的最新版本,否则可能会破坏您的应用程序,尽管--upgrade-strategy only-if-needed依赖包现在仅在必要时进行升级。


4

通常,pip会自行清理并删除构建目录的内容。唯一不这样做的情况是:

  1. 您使用了该--no-install选项
  2. 您正在使用可编辑的程序包
  3. 安装被取消或被中断。

在所有其他情况下,您都不应拥有build阻塞环境的目录。


1

定义要升级的特定版本对我帮助很大,而不仅仅是升级命令。

pip3 install larapy-installer==0.4.01 -U

0

为我解决了“ pip install -I --upgrade psutil --force”问题,之后只需卸载新版本的psutil,然后希望您可以突然安装旧版本(:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.