圏9研究所 工作室

圏9研究所の開発情報資料など

selenium で残ったSafari のプロセスをkillする

プロセスが残ってしまうのでkillするための関数を作った
圏9微博Webスクレイピング~微博フォロアー数を解析する python版に追加

1.残っているプロセス
 Applications/Safari.app/Contents/MacOS/Safari --automation

2.kill する方法
 subprocess.Popen でプロセスIDを抽出しkill する

3.コード

import os,signal
import subprocess

#   Safari --automation プロセスをkill
def kill_safari_auto():
    ps = subprocess.Popen( 'ps aux | grep "Safari --automation"', stdin=subprocess.PIPE,stdout=subprocess.PIPE, close_fds=True, shell=True, text=True).stdout
    for line in ps.readlines():
        if 'grep' in line: continue     # grepが含まれていたら無視
        pid = line.strip().split()[ 1 ] # pidを取り出す
        try:
            os.killpg( os.getpgid(int(pid)), signal.SIGKILL ) # プロセスツリーごと削除
        except:
            pass                        # 例外処理

4.トラップメモ
1)subprocess.Popenの戻り値
① str に変換するとbytesだと言われ bytesに変換するとstrと言われエラーになって返り値を処理できない
② binary が戻ってくるみたい
③ text=True を指定しstrが戻るようにする
 旧バージョンでは universal_newlines=True だったらしい

2)signal.SIGKILL
① os.killpg が動かずエラーメセージも出ない
② signal.SIGKILLが未定義
③ signal をimport する
 エラーメッセージが出なかったので見つけるのに時間がかかった