0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pypi(pip)とcondaのPythonライブラリを両方同時にアップデートする方法

Last updated at Posted at 2021-12-03

#前置き
condaでインストールされたライブラリをアップデートするためにはconda update ライブラリ名で可能です。
そして、condaでインストールされたすべてのライブラリをアップデートするためにはconda update --allで可能です。

しかし、これによりアップデートされるのはcondaでインストールされたライブラリのみであり、pipでインストールされたライブラリはこれではアップデートができません。

pipでインストールされたライブラリをアップデートするためにはpip install -U ライブラリ名とする必要があります。しかしpipでインストールされたライブラリを一気にすべてアップデートする方法はありません。

一応、pip-reviewというpipのアップデートを一気に行う手法もありますが、これを使うとcondaでインストールされたライブラリもpipでアップデートされるために、大変なことになることが多いです。

そこで、pipでインストールされたライブラリと、condaでインストールされたライブラリをそれぞれ適切にアップデートするPythonコードを書きました。

#コード

py_lib_update.py
import re
import subprocess

#pip list -oでアップデートが必要なライブラリを確認
pip_list_comm = 'pip list -o'
print(f'\nRunning command: {pip_list_comm}\n')
pip_list_raw = subprocess.run(pip_list_comm, stdout=subprocess.PIPE, shell=True).stdout.decode('utf-8')
pip_list_libs = re.split('\r|\n', pip_list_raw)

#pip listすると「-------」以降にライブラリが羅列するので、そこの行数を確認
pip_list_start_lineno = [pip_list_lib.startswith('-') for pip_list_lib in pip_list_libs].index(True) + 1

#アップデートが必要なライブラリをlist化
pip_update_libs = set([re.split('\s+', lib)[0] for lib in pip_list_libs[pip_list_start_lineno:] if not lib.isspace() and lib])
#print(pip_update_libs)

#pipでアップデートが必要なライブラリがあったら
if len(pip_update_libs) > 0:
    #一つの文字列に
    pip_update_libs_str = ' '.join(pip_update_libs)

    #pip install -U ライブラリ名でアップデート
    pip_update_comm = f'pip install -U {pip_update_libs_str}'
    print(f'Running command: {pip_update_comm}\n')
    subprocess.run(pip_update_comm, shell=True)

#すぐ容量が肥大化するのでpipのキャッシュを削除
pip_cache_purge_comm = 'pip cache purge'
print(f'\nRunning command: {pip_cache_purge_comm}\n')
subprocess.run(pip_cache_purge_comm, shell=True)

#condaのライブラリをアップデート
conda_update_comm = 'conda update --all -y'
print(f'\nRunning command: {conda_update_comm}\n')
subprocess.run(conda_update_comm, shell=True)

#まじですぐに容量が肥大化するのでcondaのキャッシュを削除
conda_clean_comm = 'conda clean --all -y'
print(f'\nRunning command: {conda_clean_comm}\n')
subprocess.run(conda_clean_comm, shell=True)

実行するには

python py_lib_update.py

とするだけです。

#注意点
ライブラリをむやみに全て一気にアップデートすると、今まで動いていたコードが急に動かなくなることがあります。
自己責任でお願い致します。

一応WindowsとLinuxでの動作確認をしておりますが、それ以外については行っていません。

疑問点などございましたらコメントください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?