使用 pip 安装特定的软件包版本

Posted

技术标签:

【中文标题】使用 pip 安装特定的软件包版本【英文标题】:Installing specific package versions with pip 【发布时间】:2021-09-16 07:25:53 【问题描述】:

我正在尝试使用 --no-site-packages 选项创建的全新 virtualenv 安装 mysql_python 的 1.2.2 版。 PyPi 中显示的当前版本是1.2.3。有没有办法安装旧版本?我试过了:

pip install MySQL_python==1.2.2

但是,安装后,它仍会在站点包中显示MySQL_python-1.2.3-py2.6.egg-info。这是这个包特有的问题,还是我做错了什么?

【问题讨论】:

感谢您的提示,这对我通过 pip install MySQL_python==1.8.9 安装旧版本的 openpyxl 很有用 【参考方案1】:

TL;DR:

pip install -Iv(即pip install -Iv MySQL_python==1.2.2

首先,我发现您正在尝试做的事情有两个问题。由于您已经安装了版本,您应该卸载当前现有的驱动程序或使用pip install -I MySQL_python==1.2.2

但是,您很快就会发现这行不通。如果您查看 pip 的安装日志,或者如果您执行pip install -Iv MySQL_python==1.2.2,您会发现 PyPI URL 链接不适用于 MySQL_python v1.2.2。你可以在这里验证:http://pypi.python.org/pypi/MySQL-python/1.2.2

由于 sourceforge.net 最近的升级和 PyPI 的旧 URL,下载链接 404 和后备 URL 链接无限重定向。

所以要正确安装驱动,可以按照以下步骤进行:

pip uninstall MySQL_python
pip install -Iv http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.2/MySQL-python-1.2.2.tar.gz/download

【讨论】:

拥有多个版本应该没有问题,这就是为每个版本创建新文件夹并使用 .pth 文件的重点。 很好奇,如果我们已经删除了现有安装,为什么还要使用 -I 选项 - 您能否提供一些详细信息? -I-Iv有什么区别? -I 用于~install~ 忽略已安装的包,-v 用于verbose-Iv 将两个标志合二为一。【参考方案2】:

您甚至可以使用带有pip install 命令的版本范围。像这样的:

pip install 'stevedore>=1.3.0,<1.4.0'

如果软件包已经安装并且您想降级它,请添加--force-reinstall,如下所示:

pip install 'stevedore>=1.3.0,<1.4.0' --force-reinstall

【讨论】:

例如:$ pip install 'xkcdpass==1.2.5' --force-reinstall 在 Windows 上使用双引号:pip install "stevedore>=1.3.0, 【参考方案3】:

按照this post 中的建议,一种方法是将pip 中的版本提及为:

pip install -Iv MySQL_python==1.2.2

即使用== 并提及版本号以仅安装该版本。 -I, --ignore-installed 忽略已安装的软件包。

【讨论】:

当心!我有这样安装不同版本彼此相邻的经验!同样有趣的是,pip list 没有意识到这一点,但conda list 是(并且会显示不同的包版本)。它也完全混淆了Pycharm【参考方案4】:

无论是第一次安装特定的python包版本,升级还是降级使用:

pip install --force-reinstall MySQL_python==1.2.4

MySQL_python 版本 1.2.2 不可用,所以我使用了不同的版本。要从索引中查看所有可用的包版本,请排除版本:

pip install MySQL_python==

【讨论】:

使用 pip 10.0.1 这是唯一可行的解​​决方案。 “-I”选项实际上是重新安装以前的版本。【参考方案5】:

我相信如果你已经安装了一个包,pip 不会用另一个版本覆盖它。使用-I 忽略以前的版本。

【讨论】:

我没有安装它 - 使用使用 --no-site-packages 选项创建的全新 virtualenv 好的,所以你要求版本 1.2.2,它仍然安装 1.2.3,没有安装其他任何东西?您使用的语法对于获取特定版本是正确的。 "使用通过 --no-site-packages 选项创建的全新 virtualenv";您可能需要在此之前使用命令 unset PYTHONPATH 以防止 pip 看到您的预安装库 No such option: -I【参考方案6】:

有时,以前安装的版本会被缓存。

~$ pip install pillow==5.2.0

它返回以下内容: 已满足要求:/home/ubuntu/anaconda3/lib/python3.6/site-packages (5.2.0) 中的pillow==5.2.0

我们可以使用 --no-cache-dir 和 -I 来覆盖它

~$ pip install --no-cache-dir -I pillow==5.2.0

【讨论】:

【参考方案7】:

由于这似乎是 pip 版本 10 中引入的一项重大更改,因此我降级为兼容版本:

pip install 'pip<10' 

此命令告诉 pip 安装低于版本 10 的模块版本。在 virutalenv 中执行此操作,这样您就不会搞砸 Python 的站点安装。

【讨论】:

【参考方案8】:

下面这个命令对我有用

Python 版本 - 2.7

包 - python-jenkins

命令 - $ pip install 'python-jenkins&gt;=1.1.1'

【讨论】:

我没有投反对票,但可以看出这并没有回答问题,也没有提供任何有用的信息供 OP 用来解决问题。【参考方案9】:

我最近在使用 pip-I 标志时遇到了一个问题,我想在某处记录:

-I不会在继续之前卸载现有的包;它只会将它安装在旧的之上。这意味着应该在版本之间删除的任何文件都将保留在原处。如果这些文件与其他已安装的模块共享名称,这可能会导致奇怪的行为。

例如,假设有一个名为 package 的包。在packages 文件之一中,他们使用import datetime。现在,在package@2.0.0 中,这指向标准库datetime 模块,但在package@3.0.0 中,他们添加了一个本地datetime.py 作为标准库版本的替代品(无论出于何种原因)。

现在假设我运行pip install package==3.0.0,但后来意识到我实际上想要版本2.0.0。如果我现在运行pip install -I package==2.0.0旧的datetime.py 文件将不会被删除,因此任何对import datetime 的调用都会导入错误的模块。

就我而言,这表现为奇怪的语法错误,因为较新版本的包添加了一个仅与 Python 3 兼容的文件,当我将包版本降级以支持 Python 2 时,我继续导入 Python-3-唯一的模块。

基于此,我认为在更新已安装的包版本时,卸载旧包总是比使用-I 更可取。

【讨论】:

【参考方案10】:

有两种方法可以安装任何版本的软件包:- A)。 pip install -Iv package-name == 版本 乙)。 pip install -v package-name == 版本

对于 A

在这里,如果您在安装时使用 -I 选项(当您不知道软件包是否已安装时)(例如 'pip install -Iv pyreadline == 2.* '或其他东西),您将使用具有不同版本的相同现有包安装新的单独包。

对于 B

    首先,您可能想检查是否有损坏的需求。 点检查

2.然后看看已经安装了什么 点子列表

3.如果软件包列表中包含您希望使用特定版本安装的任何软件包,那么更好的选择是先卸载此版本的软件包,通过 pip 卸载包名

4.现在您可以继续使用特定版本重新安装相同的软件包,方法是 pip install -v package-name==版本 例如pip install -v pyreadline == 2.*

【讨论】:

【参考方案11】:

如果您想更新到最新版本,但您不知道可以输入的最新版本是什么。

pip install MySQL_python --upgrade

这将更新 MySQL_python 以获得最新版本,您可以使用任何其他包版本。

【讨论】:

以上是关于使用 pip 安装特定的软件包版本的主要内容,如果未能解决你的问题,请参考以下文章

pip 安装指定版本软件包

ubuntu下命令怎么看查看pip版本

如何 pip 安装具有最小和最大版本范围的软件包?

python之pip安装软件包常用命令

为什么你需要升级 pip

pip包管理