pip安装选项"ignore-installed"和"force-reinstall"之间的区别

Dan*_*hen 27 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).
Run Code Online (Sandbox Code Playgroud)

似乎他们都忽略了某些东西并进行了重新安装,但我无法区分它们(如果我实际执行它们,我会看到一些区别......但我无法解释).如果我搜索"力量重新安装PIP封装",结果列出了两个--ignore-installed--force-reinstall,这让我困惑了很久.

hoe*_*ing 34

--force-reinstall

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

--ignore-installed

忽略程序包及其deps是否已安装,覆盖已安装的文件.这意味着您可以遇到--ignore-installed不卸载文件的情况,将其site-packages永久保留.想象一下,你有pkgname==1.0提供模块spam:

$ pip show -f pkgname
Name: pkgname
Version: 1.0
...
spam.py
Run Code Online (Sandbox Code Playgroud)

并将下一个版本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"
Run Code Online (Sandbox Code Playgroud)

如果您现在要升级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
Run Code Online (Sandbox Code Playgroud)

如果您要进行升级--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
Run Code Online (Sandbox Code Playgroud)

升级pip--ignore-installed没有首先卸载以前的软件包版本,并且由于新的文件结构,新文件没有覆盖旧文件.因此,旧文件现在是孤立的,不会被任何包裹拾取; 甚至pip uninstall pip不会删除孤立的文件.人们需要手动清理它们.

  • --force-reinstall`是否需要`--upgrade`标志? (2认同)
  • @mrgloom不,您可以放心地忽略它。“ --force-reinstall”意味着“ --upgrade”,其方式与“ pip install”和“ pip install”相同(找到并安装了与说明符匹配的最新版本)。 (2认同)

Ism*_*IFI 7

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

  • 好点,这也适用于需要覆盖软件包的系统安装时的用户安装(`pip install --user`)。 (2认同)
  • 对我来说,当我遇到 pip 想要卸载并重新安装依赖项的问题时,`--ignore-installed` 也非常有用,因为它无法删除 `__pycache__` 目录(在 CentOS 的 Docker 环境中发生在我身上) 7 主机,奇怪的文件系统错误) (2认同)