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