ログイン新規登録

Qiitaにログインして、便利な機能を使ってみませんか?

あなたにマッチした記事をお届けします

便利な情報をあとから読み返せます

63

この記事は最終更新日から5年以上が経過しています。

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

最終更新日 投稿日 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を実行すると、単体の実行ファイルでリソースを使用できることを確認できます。

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
  3. ダークテーマを利用できます
ログインすると使える機能について
firedfly

@firedfly(Keisuke SHIOYA)

SE13年生。C#, Python, TypeScript, Go, SQLが得意で、最近はすっかりWebエンジニアです。

コメント

0yan
@0yan(Rei Suzuki)

他メンバー向けに自動化ツールを作成・配布するのにAPI情報(Privatekey)を記載したファイルを読み込む必要がありましたが、それができなくて困っていたとき、この記事に辿り着いて無事解決できました。
ありがとうございました!!

1

いいね以上の気持ちはコメントで

Qiita Conference 2024 4月17日(水)~19(金)開催!

Qiita Conferenceは、Qiita最大規模のテックカンファレンスです!

基調講演ゲスト(敬称略)

牛尾剛、 けんすう、 ゆる言語学ラジオ、 田中邦裕、小城久美子、 飯沼亜紀

記事投稿キャンペーン開催中
Qiita×Findy記事投稿キャンペーン 「自分のエンジニアとしてのキャリアを振り返ろう!」
~
63

新規登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる

ソーシャルアカウントでログイン・新規登録

メールアドレスでログイン・新規登録