LoginSignup
0
0

More than 1 year has passed since last update.

pip listで比較元リストと比較先リストの比較(pythonでterminalを操作)

Last updated at Posted at 2021-10-06

何故このような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への比較結果の表示

IMG_6971.PNG

■完成

# 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()
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