Python

Pythonをexeした際にスクリプト実行パスを取得する方法

Python

以前に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を学習されているのあれば、この本はおすすめです。

まとめ

今回はexe化する際のスクリプトの実行パス取得方法について説明しました。

最終的にexe化するスクリプトについてはあらかじめ知っているとエラーにハマることを回避できるかと思います。

今回は以上となります。

コメント

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