昨今流行りの作業自動化のために、pythonでexeファイルやwindowsデスクトップアプリを立ち上げて、あれこれしようと考えました。しかし、exeファイルを絶対パスで指定して立ち上げようとしたところ、「初期化に失敗しました」というエラーが発生して、windowsアプリデスクトップを立ち上げられませんでした。
実行に失敗したコード
具体的には、Market Speed2という、楽天証券が提供している株価情報の取得や株取引が行えるトレーディングツールに自動ログインすることを目的としていました。
ログインに失敗したpythonスクリプトは、以下の通りです。
import os
app_path = "C:\\Users\\◯◯◯\\AppData\\Local\\MarketSpeed2\\Bin\\MarketSpeed2.exe"
os.startfile(app_path)
#◯◯◯はユーザ名
スクリプト内容自体はとてもシンプルで、実行しているOSがwindowsである場合に指定したパスのアプリケーションを実行する、というものです。
しかし、このコードでは冒頭で述べた通り、「初期化に失敗しました」というメッセージが表示されてしまいました。

失敗した原因
結論から述べると、実行エラーが発生した原因は、実行ディレクトリの概念が抜けていたことでした。
windowsアプリケーションでは、dllファイルのようなライブラリやiniファイルのような設定ファイルを使用しているケースが多いです。dllファイルやiniファイルはexeファイルを実行したときに呼び出されます。このときプログラム中でファイルを読むこむとき絶対パスではなく相対パスで指定されている場合、exeファイルを実行している作業ディレクトリが適切でないと実行時にエラーが発生します。
ちなみに原因に気がつけた理由は、ヤケクソ気味に他のWindowsアプリを実行したときのエラーメッセージで判明しました。

これはOBS Studioを実行したときに発生したエラーです。エクスプローラーでは普通に実行できているのに、pythonを経由したときに認識できなかったので、もしやと思いました。
エラーを解消したコード
というわけで実行ディレクトリを考慮したスクリプトに修正しました。
import os
#追加
os.chdir('C:\\Users\\◯◯◯\\AppData\\Local\\MarketSpeed2\\Bin\\')
app_path = "C:\\Users\\◯◯◯\\AppData\\Local\\MarketSpeed2\\Bin\\MarketSpeed2.exe"
os.startfile(app_path)
修正と言っても一文を追加しただけです。あらかじめchdir関数で作業ディレクトリを指定するようにしました。
引用ページ




コメント