end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

power shellによるwindowsのprocess検索をpython経由で実施

rpa用にpywinautoを使用していたせいか、 windowsのあるプロセスが起動済みであることを pywinauto.findwindows.find_windows()で確認していましたが、 プロセスが起動済みであるにも関わらず、 find_windows()できないケースがあり、 pywinautoでは解消できない気がしましたので、 以下のように、powershellのGet-Process を使用するようにしてみました。

これまでのNGな例

import pywinauto

def find_xerial_win():
    func_name = sys._getframe().f_code.co_name
    win_name =".*XERIAL.*"
    
    try:
        find_win = \
        lambda: pywinauto.findwindows.find_windows(title_re=win_name)[0]
        time.sleep(2)
        dialog = pywinauto.timings.wait_until_passes(5, 1, find_win)
        time.sleep(2)
    except Exception as e:
        logger.error("fail %s %s %s",func_name,win_name,e)
        return None

    if not dialog:
        logger.warning("fail %s %s, dialog is empty.",func_name,win_name)
        return None

    return True

今回のOKそうな例

import subprocess

def find_xerial_process():
    func_name = sys._getframe().f_code.co_name

    process_name ="xerial"
    powershell_cmd = 'powershell "Get-Process -Name %s"' % (process_name)
    
    try:
        process = subprocess.Popen(powershell_cmd,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE,
                                   shell=True)
        stdout, stderr = process.communicate()
        stdout = stdout.decode('utf-8')

    except Exception as e:
        logger.error("fail %s %s %s",func_name,process_name,e)
        return None

    if not process_name in stdout:
        logger.error("fail %s %s in %s",func_name,process_name,stdout)
        return None

    return True