PyQt5でスタンダアロンアプリ

先日はmacOS上でpy2appを使ってもデータベースファイルをうまく含められない(外部におくと認識されず、データとして指定するとアプリが巨大化し、メモリ不足で落ちる)と書いたが、一応解決できた。そして解決策は「Mastering GUI Programming with Python: Develop impressive cross-platform GUI applications with PyQt」という書籍に書いてあった。

方法は、pyinstallerを使う、というものなのだけれど、アプリ化したときにプログラム本体のパスがダブルクリックするアプリとは異なるので、その対策を行う、ということになる。Windowsの場合はまだ検証していないが、macOSの場合は、ダブルクリックするアイコンは実はフォルダで、その下に色々なファイルが格納されている。そしてプログラムの本体は

アプリフォルダ/contents/macOS/

にある。従って、データベース(data.db) をアプリとして見えているものと同じ場所に置いた場合、実行ファイルからアクセスするには

../../../data.db

としてアクセスしないといけないことになる。かといってアプリ化していないPythonスクリプトのままの時も正常に動くようにしたいので、

 

import os

import sys

 

if getattr(sys, 'frozen', False):

    directory = sys._MEIPASS
db_path = os.path.join(directory, '../../../data.db')
else:
    directory = os.path.dirname(__file__)
    db_path = os.path.join(directory, 'data.db')

 

のようにしておけば、

pyinstaller myapp.py --noconsole --hidden-import PyQt5.sip

でアプリ化した後でもPythonスクリプトのままでも正常にデータベースファイルにアクセスできるようになった。