何故このようなprogramを作ろうと思ったのか
というと、pipに、”python3 -m pip insutall モジュール名”でパッケージをインストールすると、インストールしたモジュール以外の関連モジュールもインストールされる。
そこで何がインストールされたか調べるために、Numbsers(exact関数)でセコセコ調べていたが、手間がかかるので pythonで処理できないかと考えて作ってみた。
ここで学んだこと[pythonの学習]
①Terminalを返さずに直接”pip list”をテキストファイルに書込
②pythonからTerminalを操作する —- subprocess
③テキストファイルに書き込む
④テキストの前後の一部抹消
⑤テキストファイルから読み込みlistにする
⑥ファイルをコピーする —- shutil
⑦llistの比較(差集合)
⑧if __name__ == ‘__main__’の使い方
■環境
macOS Ventura 13.2
python 3.10.4
■事前準備
このprogramと同じディレクトリに「o_list.txt」というテキストファイルを事前に作成してください。(中身は入りません)
■Terminalへの比較結果の表示
■完成
# Terminalで出力したpip listを前回出力したpip listと比較して変化を確認するprogram
# -------------------------------------------------------------
import subprocess as sb # pythonからterminalを操作するpacgage
import pprint # 整形して出力・表示
import shutil # Fileの copy
import platform # OS(プラットフォーム)の判別
# -------------------------------------------------------------]
# ターミナル表示の際、罫線を表示
def p():
print('-'*50)
print('')
# --------------------------------------------------------------
# o_list.txtファイルからdataをo_list(旧リスト)に代入する
with open('o_list.txt','r') as f:
o_list = f.read().split('\n')
# -------------------------------------------------------------
# pip listを実行し、出力を取得する
result = sb.run(['pip', 'list'], stdout=sb.PIPE)
# --------------------------------------
# 出力を文字列に変換し、行ごとに分割する
output = result.stdout.decode().split('\n')
# --------------------------------------
# リストの最初の2行と最後の1行は不要なため、スライスで除外する
package_list = output[2:-1]
# --------------------------------------
# 各行の文字列をタブで分割し、パッケージ名とバージョンを取得する
package_info_list = []
for package in package_list:
name, version = package.split()
lst = name + ' ' +version
package_info_list.append(lst)
# --------------------------------------
# package_info_listをテキストファイルに書き込む
# ファイル名と書き込みモードを指定してファイルを開く
with open("output.txt", "w") as f:
# リストの要素を1行ずつファイルに書き込む
for item in package_info_list:
f.write(str(item) + "\n")
# -------------------------------------------------------------
# テキストファイルからn_list(新リスト)に代入する
with open('output.txt','r') as f:
n_list = f.read().split('\n')
# --------------------------------------
# 「output.txt」を次回の比較用に「o_list.txt」に書き込む
shutil.copy('output.txt', 'o_list.txt')
# --------------------------------------
# listの比較(差集合)
p()
result = list(set(n_list) - set(o_list))
if n_list==o_list:
print('***比較した結果,前回と差異はありません***')
else:
print('[***比較した結果,次の"Package"が "追加"もしくは"update"、されています。***]')
pprint.pprint(result)
p()
print('pip listの比較(差集合)を終了します。')
p()