質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

673閲覧

Python3.11(64bit) PyWinAuto Pyinstallerで実行ファイル化 動作せず

takes.it.easy

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2024/04/10 01:06

編集2024/04/22 09:22

実現したいこと

Pyinstallerで実行ファイル化したアプリでWindowsアプリ(32bit)のボタンを認識し、クリックさせたい。

発生している問題・分からないこと

社内で使用しているソフトウェアに対しPyWinAutoで処理を行いたい。
ソフトウェア:IBM Notes

内容はある番号をExcelマクロでIBM Notesサーバーから取得し、その番号を使用して処理を行う。
VSCode上は問題なく動作するがPyinstallerで実行ファイル化したものは動作せず。
--debug allにてダイアログ取得したがどうやらエラーは吐いていない。
IBM Notesのボタンに対し処理を実行する箇所でプログラムが停止しエラーメッセージ(?)が出力されている。
IBM Notesのボタンやテキストボックスに対する処理がない場合はPyinstallerで実行ファイル化したものでも動作する。

なお、PyinstallerはWindowsセキュリティ回避のため以下のサイトを参考にコンパイラを変更している。
https://qiita.com/tru-y/items/cb3cebe9612d367dccb2

本件とは関係ない(と思われる)が、openpyxlは環境フォルダに存在しないとPyinstallerで実行ファイル化したときにNotFoundModulErrorが立つ。

エラーメッセージ

error

1[24476] LOADER: Back to parent (RC: 0) 2[24476] LOADER: Doing cleanup

該当のソースコード

Python3.11

1##※社外秘含むため一部表示を変更 2 3#!python3.11 4from pywinauto import Application 5from subprocess import Popen 6import pygetwindow as gw 7from logging import getLogger 8logger = getLogger(__name__) 9import win32.lib.win32con as win32con 10import pyautogui as pa 11import time 12import pyperclip 13import win32com.client 14import xlrd 15import openpyxl 16from tkinter import Tk, messagebox 17import os 18import ctypes 19 20cd = os.getcwd() 21 22def xlsm_method_openpyxl(): 23 24 ros = [] 25 manager = [] 26 27 fp = cd + "/Number_Search.xlsm" 28 sn = "Number_auto" 29 30 wb = openpyxl.load_workbook(fp) 31 sheet = wb[sn] 32 33 start_row = 6 34 i = 0 35 36 examiner = sheet.cell(row=2 , column=3).value 37 approver = sheet.cell(row=3 , column=3).value 38 39 while True: 40 ros_cell = sheet.cell(row=start_row+i, column=2) 41 status_cell = sheet.cell(row=start_row+i, column=3) 42 manager_cell = sheet.cell(row=start_row+i, column=4) 43 44 if ros_cell.value == None: 45 break 46 47 else: 48 if status_cell.value == '完了': 49 ros.append(number_cell.value) 50 manager.append(manager_cell.value) 51 else: 52 pass 53 54 i = i + 1 55 56 return number, manager, examiner, approver 57 58def Excel_method(): 59 60 Number= [] 61 Manager = [] 62 63 excel = win32com.client.Dispatch("Excel.Application") 64 excel.Visible = True 65 excel.DisplayAlerts = False 66 excel.Application.Run("Main()") 67 excel.ActiveWorkbook.Save() 68 ROS, Manager, examiner, approver = xlsm_method_openpyxl() 69 70 return Number, Manager, examiner, approver 71 72def main(): 73 74 print("〇 処理を開始します。") 75 76 Number = [] 77 Manager = [] 78 print("〇 番号を取得します。") 79 Number, Manager, examiner, approver = Excel_method() 80 print("〇 番号の取得が完了しました。") 81 print("〇 appへのアクセスを開始します。") 82 #appウィンドウ名 83 try: 84 app_window = gw.getWindowsWithTitle("app")[0] ##ここでは社内ソフトのウィンドウタイトルに含まれる文字列を入力。問題ないこと確認済み。 85 except: 86 app_window = gw.getWindowsWithTitle("app2")[0] 87 #appをアクティブにする 88 app_window.activate() 89 90 #appを最大化 91 app_window.maximize() 92 time.sleep(0.5) 93 print("appプロセス1") 94 # app, app_title = notes_method() 95 app_window = gw.getWindowsWithTitle("app")[0] ##同上 96 # print(app_window) 97 print("appプロセス2") 98 app_window_str = str(app_window) 99 print("appプロセス3") 100 trgt = "title=" 101 print("appプロセス4") 102 idx = app_window_str.find(trgt) 103 print("appプロセス5") 104 app_title = app_window_str[idx+len(trgt):] 105 print("appプロセス6") 106 app_title = app_title[1:] 107 print("appプロセス7") 108 app_title = app_title[:-2] 109 # print(app_title) 110 print("appプロセス8") 111 app_handle = ctypes.windll.user32.FindWindowW(0, app_title) 112 print("appプロセス9") 113 print(app_handle) 114 app = Application(backend="win32") 115 print("appプロセス10") 116 app.connect(handle=app_handle) 117 print("appプロセス11") 118 dlg = app.window(handle=app_handle) 119 print("appプロセス12") 120 print(app) 121 print(dlg) 122 print(app_title) 123 print(app[app_title]["作成IRIS.bmpbutton"]) 124 app[app_title]["作成IRIS.bmpbutton"].click() ##①ここでエラーコード(?)を出力。 125 print(dlg.print_control_identifiers(filename="log_debug.txt")) ##①をコメントアウトするとここでも引っ掛かる。 126 print("Notesプロセス13") 127 i = 0 128 ##以下ソフトウェア操作処理 129 130main() 131 132

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

エラーの出現個所を特定するため、各プロセスが完了したときにPrint()で文字列を出力。
print("appプロセス12")、print(app)、print(dlg)、print(app_title)、print(app[app_title]["作成IRIS.bmpbutton"])は表示されるが、print("Notesプロセス13")は表示されず。
以上の情報からappへのアクセス、ボタンへのアクセスは問題なし。実際にボタンに対し処理を行おうとするとエラーメッセージが表示されるようである。
[24476] LOADER: Back to parent (RC: 0)
[24476] LOADER: Doing cleanup
について検索するも目ぼしい情報は得られず。

24/4/11追記:
どうやらPyWinAutoでクリックなどの操作を行うときにはwin32ライブラリのAPIを使用しているようです。
PyWinAutoからwin32へコマンドを送信していると考えられます。

24/4/11追記2:
Windows開発者設定をオンにしても現象変わらず。

24/4/12追記:
PyWinAutoからPyAutoItに変更。
結果、各ライブラリをimportする前段階で
LOADER: Back to parent (RC: 1)
LOADER: Doing cleanup
が表示され落ちる。Back to parent (RC: *)とはなんだろうか。調べても情報なし。

24/4/19追記:
Pyinstallerのコンパイラを標準に戻し実行化ファイル作成→実行
LOADER: Back to parent (RC: 0)
LOADER: Doing cleanup
が表示され落ちる。
Pyinstallerのせいではないことが分かった。

24/4/22追記:
対象のアプリケーションをIBM Notesから別のものへ変更。
ボタンクリックできた。
IBM Notesのほうで悪さをしているorプログラムは記述通りに動作しているが、私の設定の仕方が悪いせいでプログラムが終了している可能性あり。
VSCode上ではボタンクリックできているが実行ファイル化すると終了してしまう。最初の問題に戻った。

補足

Python 3.11 64bit
VSCode 1.88.0
IBM Notes 9.0.1 32bit
Windows 10

#Pythonライブラリバージョン
pip 24.0
openpyxl 3.1.2
PyGetWindow 0.0.9
pyinstaller 6.5.0 (コンパイラ:MinGW-w64)
pywin32 306
pywin32-ctypes 0.2.2
pywinauto 0.6.8

tatsu99👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

どうも解決方法が分からず。
舵を変えツールを使う側に環境を用意してもらう方向で動いてます。

投稿2024/05/17 07:24

takes.it.easy

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問