こんにちは!
PYTHONでプログラム作成は順調に進んでいますか?
今回は、PYTHONのインストールされた全ライブラリを更新するプログラムを作成したのでシェアしたいと思います。
プログラムを作成した理由
PYTHONでプログラムの作成する際には、プログラムに必要なライブラリをインポートします。また、ライブラリがインストールされていなければ、インストールします。
そして、色々なプログラムを作成していくと、たくさんのライブラリをインストールしていることになっています。
そこで気になってくるのが、ライブラリのバージョン管理です。
PYTHONのライブラリは自動更新されません。
それぞれのライブラリの開発者が、機能向上やバグ修正の為に、ライブラリの更新をしていきますが、ユーザー側には更新情報は知らされませんし、更新されているかを知る為には、ユーザーはライブラリのホームページにアクセスするか、pipのアップグレードコマンドで更新されているか調べるしかありません。
1つや2つのライブラリであれば、調べて更新するのは問題ないのですが、ライブラリの数が多ければ多いほど面倒になってきます。
そこで、インストールしたすべてのライブラリを一気に更新出来ればと思い、今回のプログラムに至りました。
プログラム内容
インストールされているすべてのライブラリすべてを更新するプログラムです。
プログラムの内容は簡単で、インストールされている各ライブラリに、アップグレード処理「pip install –upgrade」を掛けていきます。このコマンドは、インストールされているライブラリのバージョンより新しいものであれば更新され、更新する必要がなければ更新されません。
インストールされているライブラリをどのように取得し、それぞれに「pip install –upgrade」のコマンドどのように処理していくかがプログラムのポイントになります。
プログラム
では、作成したプログラムを紹介したいと思います。
import subprocess
listbuffer01 = subprocess.Popen(['pip', 'list'], shell=True, stdout=subprocess.PIPE).stdout
print(listbuffer01)
print(type(listbuffer01))
listbuffer02 = listbuffer01.readlines()
print(listbuffer02)
print(type(listbuffer02))
countlibrary= len(listbuffer02)
print(countlibrary)
for i in range(countlibrary-2):
library00 = listbuffer02[i+2]
library01=library00.decode('ascii')
library02 = library01.split(" ")[0]
cmd1 = "pip install --upgrade " + library02
subprocess.call(cmd1, shell=True)
#プログラム終了
では、プログラムについて解説していきます。
1行目:import subprocess
2つの外部コマンド「pip list」と「pip install –upgrade」を使用する為に、「subprocess」というライブラリを使用します。
>>インストールされているライブラリを表示するコマンド
pip list
>>ライブラリを更新するコマンド
pip install --upgrade ライブラリ名
4行目:インストール済みのライブラリをチェック
listbuffer01 = subprocess.Popen(['pip', 'list'], shell=True, stdout=subprocess.PIPE).stdout
コマンド「pip list」を実行する時は、subprocessの関数内で、[‘pip’, ‘list’]のように、各ワードをシングルクォーテーションで区切ってください。
stdoutは出力の意味です。コマンド実行した時に出力されるデータが「listbuffer01」 に格納されます
7,8行目:listbuffer01の出力内容
7行目
<_io.BufferedReader name=3>
8行目
<class '_io.BufferedReader'>
『io.BufferedReader name =3』について、nameは無視して下さい。
「listbuffer01」を出力すると『io.BufferedReader』、そして型も『io.BufferedReader』です。「listbuffer01」はファイル形式と考えて下さい。
10行目:listbuffer01をファイル形式と考える
ファイル形式を読み取る為に「readlines()」を使います。そして、読み込んだデータを「listbuffer02」に格納します。
12,13行目:listbuffer02のデータを確認
12行目の出力結果
[b'Package Version\r\n', b'----------------- ---------\r\n', b'astroid 2.4.2\r\n', b'autopep8
1.5.5\r\n',..................
13行目の出力結果
<class 'list'>
12行目の出力結果は一部です。13行目の型を見ると、12行目に出力された内容はlist型であると分かります。このリストからライブラリ名を取り出せることがわかります。
ここで、リストにb’という文字が含まれています。これはバイナリーで、このままだと文字列として普通に処理が出来ません。
16,17行目:ライブラリの数をカウント
次のForループ処理の為に、ライブラリの数をカウントします。
20~25行目:リストからライブラリ名を取り出して、更新コマンドを実施
リストの最初の2つは、ライブラリとは関係ないので、ライブラリの数は2を引いた数になります。なので、リスト3つ目からライブラリ名が入ったリストになります。
先述したように、リストはバイナリーなので、文字列処理の為に「ascii」コードでデコードをしています。
「split(” “)[0]」処理で、各リストをスペースで区切り、その区切った1番目、ライブラリ名を取り出します。
そして「pip install –upgrade」のコマンドを取り出したライブラリにかけていきます。
これで更新プラグラムは完成です。
まとめ
いかがだったでしょうか。
定期的にこのプログラムを動かせば、すべてのライブラリが最新状態になります。
ただ、一部のライブラリでは古いバージョンのものが使い勝手がよかったりもする場合もあるので、その際は、そのライブラリだけを更新しない条件を加えるなど、カスタマイズして下さい。
皆さんは、ライブラリの更新はどのようにされていますか。プログラムが思うように動いていれば、急ぎたっての更新は必要ないかもしれませんね。
「役に立った!」と思れましたら、下のSNSボタンで記事のシェアをしていただけると嬉しいです!
コメント