LoginSignup
47
64

More than 5 years have passed since last update.

PyInstallerで実行ファイルにリソースを埋め込み

Last updated at Posted at 2019-01-14

リソースを埋め込んだ実行ファイルを生成する手順

PyInstallerを使うとPythonスクリプトを実行ファイル(.exe)にできます。
ただ、画像などリソースファイルを埋め込んだ単体の実行ファイルにするには一手間かかるため
その手順について説明します。Windows 10環境で説明しますが、MacやLinuxでも変わらないはずです。

リソースファイルの参照方法を変更

実行に埋め込んだリソースは実行時に別フォルダに展開されます。
(例:%USERPROFILE%/AppData/Local/Temp/_MEIxxxxxx)
これを参照できるよう関数を追加し、リソース参照時はこれを使用するようにします。

リソースを参照するresource_path関数を使った例
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はお好みで。余計なコンソールが開かなくなります)

書き換え後のspecファイル

# -*- 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を作成します。

specファイルを使って単一の実行ファイルを作成
> pyinstaller test.spec

distフォルダのexeを確認

./dist/test.exeを実行すると、単体の実行ファイルでリソースを使用できることを確認できます。

47
64
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
64