パッケージの再インストールに関連するpip install
と--ignore-installed
の2つの--force-reinstall
オプションがあります。
これらの2つのオプションは、公式ドキュメントで次のように説明されています
--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
パッケージとその依存関係が既にインストールされているかどうかを無視し、インストールされたファイルを上書きします。これは、--ignore-installed
がファイルをアンインストールせず、site-packages
に永久に残すような状況になる可能性があることを意味します。モジュールspam
を提供するpkgname==1.0
があるとします:
$ 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
で使用可能な古いモジュールが原因で、再インストール後に不明瞭なインポートエラーが発生する場合があります。
すべてのパッケージが_internal
パッケージの下に移動された最新のpip
変更で再現する例:新しい仮想環境を作成し、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
でも孤立ファイルは削除されません。手動でクリーンアップする必要があります。