pythonでexeファイルやwindowsデスクトップアプリの実行時に初期化のエラーが発生したとき

Python

昨今流行りの作業自動化のために、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関数で作業ディレクトリを指定するようにしました。

引用ページ

DLLファイルとは - IT用語辞典
DLLファイルとは、Windowsのプログラムファイルの種類の一つで、様々なプログラムから利用される汎用性の高い機能を収録した、部品化されたプログラムのこと。標準のファイル拡張子は「.dll」。DLLファイルはそれ自体は単体で実行することは...
os --- 雑多なオペレーティングシステムインターフェース
ソースコード: Lib/os.py このモジュールは、 OS 依存の機能を利用するポータブルな方法を提供します。単純なファイルの読み書きについては、 open() を参照してください。パス操作については、 os.path モジュールを参照し...

コメント

タイトルとURLをコピーしました