リソースを埋め込んだ実行ファイルを生成する手順
PyInstallerを使うとPythonスクリプトを実行ファイル(.exe)にできます。
ただ、画像などリソースファイルを埋め込んだ単体の実行ファイルにするには一手間かかるため
その手順について説明します。Windows 10環境で説明しますが、MacやLinuxでも変わらないはずです。
リソースファイルの参照方法を変更
実行に埋め込んだリソースは実行時に別フォルダに展開されます。
(例:%USERPROFILE%/AppData/Local/Temp/_MEIxxxxxx)
これを参照できるよう関数を追加し、リソース参照時はこれを使用するようにします。
import tkinter as tk
import sys
import os
def resource_path(relative_path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
root = tk.Tk()
photo = tk.PhotoImage(file=resource_path("image.png"))
label = tk.Label(root, image=photo)
label.pack()
root.mainloop()
specファイルを作成
pyinstallerが未インストールならpipでインストールします。
スクリプトファイルに対してpyinstallerを実行するとspecファイルが作成されます。
./dist/test/test.exe
も作成されますが、まだ単一の実行ファイルではありません。
ここではリソース(image.png)がスクリプトと同じ階層にあるとします。
> pip install pyinstaller
> pyinstaller test.py
specファイルを書き換え
外部ファイルはdatasに記述する仕様なので
a.datas += [('image.png', '.\\image.png', 'DATA')]
を加えます。
複数のリソースを追加する場合は、その分だけ加えます。
またEXE()の引数のexclude_binaries=False,
を削除し
a.binaries,
とa.datas,
を追加します。
(console=Falseはお好みで。余計なコンソールが開かなくなります)
# -*- mode: python -*-
block_cipher = None
a = Analysis(['test.py'],
pathex=['D:\\Desktop'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
a.datas += [('image.png', '.\\image.png', 'DATA')]
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.datas,
name='test',
debug=False,
strip=None,
upx=True,
console=False)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='test')
specファイルを使ってexeを作成
コンソールにspecファイルを指定してexeを作成します。
> pyinstaller test.spec
distフォルダのexeを確認
./dist/test.exe
を実行すると、単体の実行ファイルでリソースを使用できることを確認できます。