pipでアップデートを半自動的に行う方法。

結論から先に書きますが、全然半自動にすらなっていません。試してみたことのメモです。

Python 2/3でいくつかのモジュールをPyPiからインストールして使用していますが、モジュールがアップデートされたときにはキャッチアップしたいときがあります。ところが現状 pip ではアップデートがあるモジュールを自動で検索して全部を一括してアップデートできません。

pipに一括アップデートがない理由のひとつは、モジュールの依存関係にあるようです。
あるモジュールAが、たとえばモジュールBのバージョン 1.0 に依存しているとします。モジュールAはバージョンアップしていませんが、モジュールBが2.0にバージョンアップしました。ところがモジュールBのAPIが変わってしまい、モジュールAはモジュールB 2.0では動作できなくなりました。
というようなことが現実に起こり得るため、盲目的な一括アップデートは推奨されていません。

また、検索してみるといくつかヒットして、いずれも "pip list" で一覧を取得して、総当たり的にすべてのモジュールに "pip install -U" をしかけるという形のようです。同様のことが、Unix系の環境では pipdate というユーティリティで行えます。これは pipdate / pipdate3 というスクリプトと、pipdateモジュールを提供していますが、スクリプトの方は以下のようになっていました。

pipdate3:
pip3 freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip3 install -U

同様に依存関係には無頓着にアップデートしてしまうようです。

依存関係をチェックするためには、pipdeptree があります。

自分の環境で pipdeptree を使ってみたらコンフリクトの警告が出ました。

$ pipdeptree
Warning!!! Possibly conflicting dependencies found:
* neovim-remote==2.0.10
 - neovim [required: >=0.2.3, installed: ?]

これは、neovim-remote が neovim-python に依存しているのに、neovim-pythonからpynvimへ。で触れたように neovim-python が廃止されたから、でしょう。

ということで neovim-remote をアップデートします。
$ pip install -U neovim-remote
Collecting neovim-remote
  Downloading https://files.pythonhosted.org/packages/23/55/89b7528c43771e63b0b035b78dd8a05de29cc8c7a9bcf1b1b155df095a6f/neovim-remote-2.1.3.tar.gz
Requirement already satisfied, skipping upgrade: pynvim in c:\apps\python37\lib\site-packages (from neovim-remote) (0.3.1)
Requirement already satisfied, skipping upgrade: psutil in c:\apps\python37\lib\site-packages (from neovim-remote) (5.4.6)
Requirement already satisfied, skipping upgrade: setuptools in c:\apps\python37\lib\site-packages (from neovim-remote) (39.0.1)
Requirement already satisfied, skipping upgrade: msgpack>=0.5.0 in c:\apps\python37\lib\site-packages (from pynvim->neovim-remote) (0.5.6)
Requirement already satisfied, skipping upgrade: greenlet in c:\apps\python37\lib\site-packages (from pynvim->neovim-remote) (0.4.13)
Installing collected packages: neovim-remote
  Found existing installation: neovim-remote 2.0.10
    Uninstalling neovim-remote-2.0.10:
      Successfully uninstalled neovim-remote-2.0.10
  Running setup.py install for neovim-remote ... done
Successfully installed neovim-remote-2.1.3

$ pipdeptree --packages neovim-remote
neovim-remote==2.1.3
  - psutil [required: Any, installed: 5.4.6]
  - pynvim [required: Any, installed: 0.3.1]
    - greenlet [required: Any, installed: 0.4.13]
    - msgpack [required: >=0.5.0, installed: 0.5.6]
  - setuptools [required: Any, installed: 39.0.1]
これで警告が消えました。

今回は簡単でしたが、一括アップデートしたい場合には、pipdeptreeで「バージョンがxx以下であること」という依存関係があるかどうかをチェックしてから行うほうが安全のようです。そういう目で見てみると、

flake8==3.5.0
  - mccabe [required: >=0.6.0,<0.7.0, installed: 0.6.1]
  - pycodestyle [required: >=2.0.0,<2.4.0, installed: 2.3.1]
  - pyflakes [required: >=1.5.0,<1.7.0, installed: 1.6.0]
requests==2.21.0
  - certifi [required: >=2017.4.17, installed: 2018.11.29]
  - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
  - idna [required: >=2.5,<2.9, installed: 2.8]
  - urllib3 [required: >=1.21.1,<1.25, installed: 1.24.1]
あたりは引っかかりそうです。 あとついでに、pip自身のバージョンが古いんですけどー、といわれた場合には、Windowsの場合は
python -m pip install -U pip
を、Linuxの場合は
pip install -U pip
すればいいです。
"-U" は "--upgrade" と同じ意味です。

0 件のコメント:

コメントを投稿

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...