#前置き
condaでインストールされたライブラリをアップデートするためにはconda update ライブラリ名
で可能です。
そして、condaでインストールされたすべてのライブラリをアップデートするためにはconda update --all
で可能です。
しかし、これによりアップデートされるのはcondaでインストールされたライブラリのみであり、pipでインストールされたライブラリはこれではアップデートができません。
pipでインストールされたライブラリをアップデートするためにはpip install -U ライブラリ名
とする必要があります。しかしpipでインストールされたライブラリを一気にすべてアップデートする方法はありません。
一応、pip-review
というpipのアップデートを一気に行う手法もありますが、これを使うとcondaでインストールされたライブラリもpipでアップデートされるために、大変なことになることが多いです。
そこで、pipでインストールされたライブラリと、condaでインストールされたライブラリをそれぞれ適切にアップデートするPythonコードを書きました。
#コード
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での動作確認をしておりますが、それ以外については行っていません。
疑問点などございましたらコメントください。