点安装选项“忽略安装”和“强制重新安装”之间的区别

时间:2018-08-18 23:47:56

标签: python pip pypi

有两个与重新安装软件包有关的pip install选项,分别是--ignore-installed--force-reinstall

这两个选项在官方文档中描述如下

--force-reinstall
Reinstall all packages even if they are already up-to-date.

-I, --ignore-installed
Ignore the installed packages (reinstalling instead).

似乎它们都忽略了某些东西并进行了重新安装,但是我不能说出它们之间的区别(如果我实际执行它们,我可以看到一些区别……但是我无法解释)。如果我搜索“以pip强制重新安装软件包”,结果将同时列出--ignore-installed--force-reinstall,这使我很困惑。

2 个答案:

答案 0 :(得分:17)

--force-reinstall

在安装软件包之前,请先将其卸载(如果已安装)。与为软件包及其每个依赖项运行pip uninstall -y dep && pip install dep几乎相同。

--ignore-installed

忽略软件包及其Dep是否已经安装,覆盖已安装的文件。这意味着您可能会遇到--ignore-installed无法卸载文件而将其永久保留在site-packages中的情况。假设您有pkgname==1.0提供了模块spam

$ pip show -f pkgname
Name: pkgname
Version: 1.0
...
spam.py

,下一个版本pkgname==2.0重命名了spameggs。运行pip install pkgname==2.0 --ignore-installed时,spam.py不会被删除,直到您手动将其永久删除为止都是孤儿。

后果

--force-reinstall应该始终是首选;仅当您知道自己在做什么并确保重新安装将覆盖当前安装的文件时,才使用--ignore-installed。否则,由于sys.path中仍旧模块过时,重新安装后可能会导致模糊的导入错误。

示例

以最新的pip更改重现的示例,其中所有软件包均移至_internal软件包下:创建一个新的虚拟环境并将pip降级到版本9:

$ mkvirtualenv testenv
$ workon testenv
(testenv) $ pip install "pip<10"

如果现在要通过pip--force-reinstall升级到最新版本,则将执行干净升级。之后,您将拥有_internal_vendor正确的包结构:

(testenv) $ pip install pip --upgrade --force-reinstall
(testenv) $ ls -l $VIRTUAL_ENV/lib/python3.7/site-packages/pip
total 16
-rw-r--r--   1 hoefling  staff   21 19 Aug 11:47 __init__.py
-rw-r--r--   1 hoefling  staff  623 19 Aug 11:47 __main__.py
drwxr-xr-x   4 hoefling  staff  128 19 Aug 11:47 __pycache__
drwxr-xr-x  25 hoefling  staff  800 19 Aug 11:47 _internal
drwxr-xr-x  26 hoefling  staff  832 19 Aug 11:47 _vendor

如果您要使用--ignore-installed进行升级,则:

(testenv) $ pip install pip --upgrade --ignore-installed
(testenv) $ ls -l $VIRTUAL_ENV/lib/python3.7/site-packages/pip
total 392
-rw-r--r--   1 hoefling  staff     21 19 Aug 12:33 __init__.py
-rw-r--r--   1 hoefling  staff    623 19 Aug 12:33 __main__.py
drwxr-xr-x  14 hoefling  staff    448 19 Aug 12:33 __pycache__
drwxr-xr-x  25 hoefling  staff    800 19 Aug 12:33 _internal
drwxr-xr-x  28 hoefling  staff    896 19 Aug 12:33 _vendor
-rw-r--r--   1 hoefling  staff  11910 19 Aug 12:33 basecommand.py
-rw-r--r--   1 hoefling  staff  10465 19 Aug 12:33 baseparser.py
-rw-r--r--   1 hoefling  staff  16474 19 Aug 12:33 cmdoptions.py
drwxr-xr-x  16 hoefling  staff    512 19 Aug 12:33 commands
drwxr-xr-x   5 hoefling  staff    160 19 Aug 12:33 compat
-rw-r--r--   1 hoefling  staff  32153 19 Aug 12:33 download.py
-rw-r--r--   1 hoefling  staff   8121 19 Aug 12:33 exceptions.py
-rw-r--r--   1 hoefling  staff  39950 19 Aug 12:33 index.py
-rw-r--r--   1 hoefling  staff   5626 19 Aug 12:33 locations.py
drwxr-xr-x   5 hoefling  staff    160 19 Aug 12:33 models
drwxr-xr-x   6 hoefling  staff    192 19 Aug 12:33 operations
-rw-r--r--   1 hoefling  staff  10980 19 Aug 12:33 pep425tags.py
drwxr-xr-x   8 hoefling  staff    256 19 Aug 12:33 req
-rw-r--r--   1 hoefling  staff    156 19 Aug 12:33 status_codes.py
drwxr-xr-x  16 hoefling  staff    512 19 Aug 12:33 utils
drwxr-xr-x   8 hoefling  staff    256 19 Aug 12:33 vcs
-rw-r--r--   1 hoefling  staff  32010 19 Aug 12:33 wheel.py

使用pip升级--ignore-installed不会先卸载先前的软件包版本,并且由于新的文件结构,新文件并未覆盖旧文件。结果,旧文件现在变成孤立文件,不再被任何程序包拾取。即使pip uninstall pip也不会删除孤立的文件。需要手动清理它们。

答案 1 :(得分:3)

-如果您有一个继承全局站点程序包的虚拟环境并且想要覆盖全局安装(而不卸载它),则也可以使用ignore-installed。
例如,您可以在全局python安装中拥有N版本,而在venv中拥有N + 1版本。
在虚拟环境中测试/调试软件包的新版本非常方便。