web-dev-qa-db-ja.com

pipインストールオプション「ignore-installed」と「force-reinstall」の違い

パッケージの再インストールに関連する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の両方がリストされ、長い間混乱します。

21
Daniel Chen

--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.0spamの名前を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でも孤立ファイルは削除されません。手動でクリーンアップする必要があります。

26
hoefling