关于python:pip安装选项“ ignore-installed”和“ force-reinstall”之间的区别

Difference between pip install options “ignore-installed” and “force-reinstall”

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

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

1
2
3
4
5
--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,这使我很困惑。


--force-reinstall

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

--ignore-installed

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

1
2
3
4
5
$ pip show -f pkgname
Name: pkgname
Version: 1.0
...
spam.py

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

后果

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

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

1
2
3
$ mkvirtualenv testenv
$ workon testenv
(testenv) $ pip install"pip<10"

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

1
2
3
4
5
6
7
8
(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进行升级:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(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

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