pip 安装选项 "ignore-installed" 和 "force-reinstall" 之间的区别
Difference between pip install options "ignore-installed" and "force-reinstall"
有两个 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).
似乎他们都忽略了一些东西并进行了重新安装,但我无法分辨它们之间的区别(如果我实际执行它们,我会看到一些区别......但我无法解释)。如果我搜索"force reinstall packages in pip",结果列出了--ignore-installed
和--force-reinstall
,这让我很困惑。
--force-reinstall
在安装包之前,如果已经安装,将首先卸载它。与包及其每个依赖项的 运行 pip uninstall -y dep && pip install dep
几乎相同。
--ignore-installed
忽略包及其依赖是否已经安装,覆盖已安装的文件。这意味着您可能会遇到 --ignore-installed
不卸载文件的情况,将其永远留在 site-packages
中。假设您有 pkgname==1.0
提供模块 spam
:
$ pip show -f pkgname
Name: pkgname
Version: 1.0
...
spam.py
下一个版本 pkgname==2.0
将 spam
重命名为 eggs
。当 运行 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"
如果您现在要通过 --force-reinstall
将 pip
升级到最新版本,则会执行干净升级。之后,你有正确的包结构 _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
用--ignore-installed
升级pip
没有先卸载以前的包版本,由于新的文件结构,新文件没有覆盖旧文件。结果,旧文件现在成为孤立文件,不会被任何包接收;即使 pip uninstall pip
也不会删除孤立文件。需要手动清理它们。
--如果你有一个继承全局站点包的虚拟环境并且你想覆盖全局安装(而不是卸载它),也可以使用--ignore-installed。
例如,您可以在全局 python 安装中使用版本 N,在 venv 中使用版本 N+1。
在虚拟环境中test/debug一个包的新版本非常方便。
有两个 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).
似乎他们都忽略了一些东西并进行了重新安装,但我无法分辨它们之间的区别(如果我实际执行它们,我会看到一些区别......但我无法解释)。如果我搜索"force reinstall packages in pip",结果列出了--ignore-installed
和--force-reinstall
,这让我很困惑。
--force-reinstall
在安装包之前,如果已经安装,将首先卸载它。与包及其每个依赖项的 运行 pip uninstall -y dep && pip install dep
几乎相同。
--ignore-installed
忽略包及其依赖是否已经安装,覆盖已安装的文件。这意味着您可能会遇到 --ignore-installed
不卸载文件的情况,将其永远留在 site-packages
中。假设您有 pkgname==1.0
提供模块 spam
:
$ pip show -f pkgname
Name: pkgname
Version: 1.0
...
spam.py
下一个版本 pkgname==2.0
将 spam
重命名为 eggs
。当 运行 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"
如果您现在要通过 --force-reinstall
将 pip
升级到最新版本,则会执行干净升级。之后,你有正确的包结构 _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
用--ignore-installed
升级pip
没有先卸载以前的包版本,由于新的文件结构,新文件没有覆盖旧文件。结果,旧文件现在成为孤立文件,不会被任何包接收;即使 pip uninstall pip
也不会删除孤立文件。需要手动清理它们。
--如果你有一个继承全局站点包的虚拟环境并且你想覆盖全局安装(而不是卸载它),也可以使用--ignore-installed。
例如,您可以在全局 python 安装中使用版本 N,在 venv 中使用版本 N+1。
在虚拟环境中test/debug一个包的新版本非常方便。