以前にPythonスクリプト(.py)をpyinstallを利用してexeファイル化する方法について紹介しました。
Pythonスクリプトをexe化することで、Pythonのインストール環境がなくても簡単に誰でも実行することができますし、ソースコードも隠蔽かすることができるなど、かなりのメリットがあります。
Pythonをexe化すること自体についてはpyinstallerを使えばかなり簡単にできる(以下の記事参照)のですが、exe化したアプリケーションがうまく動かない!という事が多々あります。
よくある動かない原因がexeファイルの実行パスの違いです。
今回はそのトラブルの原因と対応方法について説明したいと思います。
スクリプトの実行パスを取得する方法
通常、Pythonスクリプトでスクリプトの実行パスを取得する場合は、sysモジュールを使って以下のようにすることができます。
impport os
base_path = os.path.dirname(__file__)
「__file__」には実行されたスクリプトのフルパスが(例としてC:\Users\user\Desktop\PythonDir\test.py)が入っており、os.path.direnameでフォルダ名(C:\Users\user\Desktop\PythonDir)を取得することができます。
Pythonスクリプト(.py)ファイルを実行している場合には、問題なくPythonスクリプトが実行されたPathを取得することができます。
ただ、今回のような「.py」ではなく、「.exe」ファイルを実行する場合には、少し違った実行結果となって問題が発生することがあります。
exe化した際に取得されるパスは?
では、exeファイルを実行した場合ではどのような違いがあるのか説明します。
exe化したアプリケーションを実行すると、まず①スクリプトの実体をTemporaryフォルダにコピーした後に、②スクリプトを実行する、という動きになります。
例えばTemporaryフォルダは以下のようなパスになります。なお、このパスは実行するたび変わります。
C:\Users\User\AppData\Local\Temp_MEI48762
つまり、実行している場所がexeが置いてあるパスと異なるため、もしexeファイルを配置したファイルを相対パスでファイルなどで操作しようとすると、「Not found」でエラーになってしまいます。
対応方法
ちなみに、exeファイルを実行した場合に先ほどの「__file__」でパスを取得する方法では結果が空になって取得できません。
対応方法ですが、exeファイルを実行したパスを取りたい場合には、次のように取得を行うことで対処することができます。__file__は使わないほうがいいです。
import sys
import os
path_current_dir = os.path.dirname(sys.argv[0])
print(sys.argv[0])
print(path_current_dir)
sys.argv[0]には、実行ファイルまでのフルパスが入っているので__file__と同じように使うことができます。
なお、exeのTemporaryの実行パスを取得したい場合は「sys._MEIPASS」変数で取得することができます。
ただし、この変数はexeから展開された場合のみ取得できるため、Pythonスクリプトをそのまま実行した場合には取得できずにエラーになるので、以下のような感じでtryで補足します。
import sys
import os
def get_dir_path(relative_path):
try:
base_path = sys._MEIPASS
print("[Base Path (get from sys)]" + base_path)
except Exception:
base_path = os.path.dirname(__file__)
print("[Base Path (get from sys)]" + base_path)
return os.path.join(base_path, relative_path)
get_dir_path(sys.argv[0])
Pythonのオススメ勉強方法
私がオススメするPython初心者向けの最初に購入すべき書籍は「シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全」です。
シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全
この書籍は実際にシリコンバレーの一流エンジニアとして活躍している酒井潤さんが書いた本です。
内容も初心者から上級者までまとめられており、各Lessonも長すぎずに分かりやすくまとめられているので、初心者の方にもおすすめです。
シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全
まとめ
今回はexe化する際のスクリプトの実行パス取得方法について説明しました。
最終的にexe化するスクリプトについてはあらかじめ知っているとエラーにハマることを回避できるかと思います。
今回は以上となります。
コメント