我可以隐式地防止pip降级包吗?

时间:2017-03-30 14:39:01

标签: python django pip downgrade

我在我的python虚拟环境中安装了Django 1.10.5。

当我用pip install djblets将djblets安装到我的virtualenv中时,遗憾的是,Django在此过程中被隐式降级为版本1.8.17。这打破了我的环境。

我能做些什么来阻止这种情况吗?我当然不被问到我是否对降级感到满意。但我真的应该拥有。

djblets版本0.9.6甚至没有安装,因为它依赖于拒绝构建的Pillow。这一切都刚刚破坏并导致我的环境一路走来,因为首先是卸载。

我能想到的只是在一个单独但相同的虚拟环境中尝试安装,看看会发生什么。就像干跑一样。

现在我必须从头开始安装我的环境。我错过了什么,或者这只是它的方式?

2 个答案:

答案 0 :(得分:1)

您需要同时安装两个软件包(只有一个命令)并指定软件包的数字版本

pip install django==1.10.5 djblets

根据经验,我不是一个一个地安装您的软件包,而是建议您使用requirements.txt文件。

对于您的示例,您的文件requirements.txt将(至少):

django==1.10.5
djblets==1.0.2

然后,您可以使用pip选项[--requirements, -r]一次安装所有包:

pip install -r requirements.txt

<强>为什么吗

除非明确告知,pip将尝试为给定模块(包本身中描述的模块)安装最佳依赖项,甚至可以降级一个包!

通常情况下,您无法选择降级NOR升级包以使其正常工作。这就是为什么在每个需要的软件包中添加版本号非常重要的原因,以避免回归!

<强>提示

(好的,因为update选项仅适用于具有未指定版本号的软件包)

  • 您还可以使用pip选项[--no-deps]来安装完全没有依赖关系的包:

    pip install --no-deps djblets
    

但是,只有安装了所有依赖项后,此方法才有效。

<强>加成

要回答你没有提出的问题,你可以制作一个&#34;快照&#34;如果您害怕使用pip freeze

进行错误的操作,请安装所有软件包
pip freeze > requirements.txt

答案 1 :(得分:0)

实际上并没有较新的文档版本(好吧,很久很久以前就是pip 7.1),尽管并没有完全记录如下:

Pip constraint files

因此,以下命令(您需要在项目目录中运行它们并可能对其进行自定义):

pip freeze | grep == | sed 's/==/>=/' >constraints.txt
pip install -c constraints.txt whatever-you-want-to-install

将安装您想要安装的任何东西而不会降级任何东西。警告:无论您要安装什么,实际上都需要较低版本的“ sometoy”,无论您要安装什么,都将被破坏,至少与“ sometoy”的使用有关。

在某些情况下,破损可能是可以接受的(例如,在您不使用的软件包的某些可选区域中发生),在某些情况下,可能不会发生实际的破损(例如,不再需要降级的版本约束),在某些情况下,真正糟糕的事情会发生,它们就在你身上。