栖王ヴァルハラ3丁目 ヘッダーイラスト
Illustration by ruder

明日になったら今日じゃない

栖王ヴァルハラ3丁目

すばら3 / Subara3

PyInstallerでのexe化とファイル制御についての覚え書き

カテゴリ: tech

タグ: Python, 技術

目的

Pythonスクリプトを PyInstaller で実行ファイル(.exe)に変換する。
このとき、

  • ファイルA … 変更がないためビルド時にexeに含めたい。
  • ファイルB … 学習モデルなど、更新がありうるため外部から読み込みたい。

つまり、「一部のファイルだけ外部参照にする」方法のメモ。

PyInstallerとは?

PyInstallerは、Pythonスクリプトとその依存関係をすべて含んだ実行可能ファイルを作成するライブラリ。生成されたexeファイルは、Pythonがインストールされていない環境でも動作する。

pythonで作られたプログラムを動かす場合、python環境が必要になるが、カタギの人間のパソコンにはそういうモンが入ってはいないので、exeにしてやる必要がある。

PyInstallerの使い方

インストール

pip install pyinstaller

基本的な使い方

1. 最もシンプルな例

pyinstaller main.py

この場合、dist/main/フォルダにexeファイルと依存関係が配置される。

2. 単一ファイル生成

pyinstaller --onefile main.py

dist/main.exeとして1つのファイルが生成される。

3. よく使用されるオプション

pyinstaller --onefile --noconsole --name myapp main.py
  • --onefile: 単一ファイル生成
  • --noconsole: コンソールウィンドウを非表示
  • --name: 出力ファイル名を指定

なお、pyで実行したものとビルドしたexeを実行すると違った動作をすることがよくある。
(特に、パス周りではトラブルが発生しがちである。)

EXE でよく使うオプション

項目 説明
name='main' 出力ファイル名(例:main.exe
console=True コンソールを表示(GUIアプリなら False
upx=True UPXによる圧縮を有効化(軽量化)
strip=False デバッグ情報を削除するかどうか
debug=False デバッグモードを有効化するか
課題: 外部ファイルの参照

Pythonアプリケーションが設定ファイル、データファイル、画像などの外部ファイルを使用している場合、そのままexe化してもファイルが見つからずエラーになってしまう。

プロジェクト構成例

myproject/
├── main.py
├── resource_utils.py
├── data/
│   ├── sample.txt          # exe内蔵
│   ├── config.json         # exe内蔵
│   └── user_settings.txt   # exe外部
└── assets/
    └── logo.png            # exe内蔵

解決策1: --add-dataオプション

pyinstaller --onefile --add-data "config.json;." --add-data "data;data" main.py
  • Windowsでは;、Linux/macOSでは:で区切る
  • "元のパス;exeでの配置先"の形式

解決策2: リソースパス取得関数

PyInstallerでビルドした場合とそうでない場合で、ファイルパスを適切に取得する関数を作成する。

import os
import sys

def get_resource_path(relative_path):
    """
    PyInstallerでビルドされたexeファイル内のリソースファイルへのパスを取得する

    Args:
        relative_path (str): リソースファイルの相対パス

    Returns:
        str: リソースファイルの絶対パス
    """
    try:
        # PyInstallerでビルドされた場合、sys._MEIPASSが設定される
        base_path = sys._MEIPASS
    except AttributeError:
        # 開発環境では現在のスクリプトのディレクトリを使用
        base_path = os.path.dirname(os.path.abspath(__file__))

    return os.path.join(base_path, relative_path)

使用例

import os
from resource_utils import get_resource_path

def main():
    # 設定ファイルの読み込み
    config_path = get_resource_path("config.json")

    if os.path.exists(config_path):
        with open(config_path, 'r') as f:
            config = json.load(f)
        print("設定ファイルを読み込みました")
    else:
        print("設定ファイルが見つかりません")

if __name__ == "__main__":
    main()

specファイルによる詳細制御

specファイルとは

specファイル(Specification File)は、PyInstallerがexeを作成する際の詳細設定を記述したPythonスクリプト。複雑な設定や、特定のファイルの包含・除外を行う場合に使用する。

specファイルの生成

pyinstaller --name myapp main.py

これによりmyapp.specファイルが生成されます。

specファイルの構造

# -*- mode: python ; coding: utf-8 -*-

# ------------------------------------------------------------
# PyInstaller Spec: 必要最小限構成
# ------------------------------------------------------------
a = Analysis(
    ['main.py'],  # 実行エントリーポイント
    datas=[
        ('test_data.txt', '.'),          # exe直下に配置
        ('data/sample.txt', 'data'),     # data/sample.txt として同梱
        ('data/config.json', 'data'),    # data/config.json を含める
        # ('data/unsample.txt', 'data'), # 除外する場合はコメントアウト
        ('assets/logo.png', 'assets'),   # assets/logo.png を含める
    ],
)

pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name='main_selective',  # 出力exe名
    console=True            # コンソール表示(GUIならFalse)
)

specファイルでのビルド

pyinstaller myapp.spec

実際のところ、パスはどうなっているのか?

------------------------------
【内部リソースファイル(exe内)】
------------------------------
ファイル: data\sample.txt
  実際のパス: C:\Users\[ユーザー名]\AppData\Local\Temp\_MEI233922\data\sample.txt
------------------------------
ファイル: data/config.json
  実際のパス: C:\Users\[ユーザー名]\AppData\Local\Temp\_MEI233922\data\config.json
------------------------------
ファイル: assets\logo.png
  実際のパス: C:\Users\[ユーザー名]\AppData\Local\Temp\_MEI233922\assets\logo.png
------------------------------
【外部リソースファイル(exeと同じ場所)】
------------------------------
ファイル: data\sample.txt
  実際のパス: D:[実際の実行ファイルの位置]

パスはこんな感じになっている。
一時フォルダ(TempのMEIフォルダ)が肥大化してしまうことがある。

参考資料

記事

プライバシーポリシー Last Update: 2025/10/14

個人情報の取り扱いについて

当サイトでは、お問い合わせフォームからご連絡いただいた際に、お名前やメールアドレスなどの個人情報をお預かりすることがあります。

これらの情報は、お問い合わせへの返信や必要なご連絡のためにのみ使用し、それ以外の目的で使用することはありません。また、法令に基づく場合を除き、第三者に開示・提供することはありません。

Cookieの使用について

当サイトでは、サイトの利便性向上やアクセス解析のためにCookieを使用しています。

Cookieはブラウザの設定により無効にすることができますが、一部の機能が正しく動作しなくなる場合があります。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Google Analytics」を使用しています。

Google Analyticsはトラフィックデータの収集のためにCookieを使用しており、このトラフィックデータは匿名で収集されています。個人を特定するものではありません。

この機能はCookieを無効にすることで収集を拒否することができますので、お使いのブラウザの設定をご確認ください。

詳細については、Google アナリティクス利用規約をご参照ください。

広告の配信について

当サイトでは、第三者配信の広告サービス「Google AdSense」を使用しています。

広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookieを使用することがあります。

Google AdSenseの詳細については、Google 広告に関するポリシーをご参照ください。

アフィリエイトについて

当サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。

その他、各種アフィリエイトプログラムに参加している場合があります。

著作権について

当サイトに掲載されている文章、画像、その他のコンテンツの著作権は、当サイト管理者または正当な権利を有する第三者に帰属します。

無断転載・複製はご遠慮ください。引用の際は、出典を明記のうえ、リンクを貼っていただけますようお願いいたします。

免責事項

当サイトの情報は、可能な限り正確な情報を掲載するよう努めていますが、その正確性や安全性を保証するものではありません。

当サイトに掲載された内容によって生じた損害等について、一切の責任を負いかねますのでご了承ください。

また、当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直し、その改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。

01

ここについて

栖王ヴァルハラ3丁目は、個人(頻子)が運営しているサイトです。小説、ゲーム、アプリケーションなどがあります。サイトのコンテンツは、予告なく改稿したり、削除されることがあります。

(2022/5/29)二次創作置き場を増設しました。


もし何かご用があれば、お問い合わせフォームからお声をおかけください(記名不要)。

応援・ご感想・誤字脱字報告などお気軽にどうぞ

お問い合わせ
02

自己紹介

頻子(ひんこ)です。
ゲームと文章を書くことが好きです。

info★subara3.com (★→@)

活動場所

投げ銭

03

このサイトへのリンク

2017/09/06 有料サーバーに移行 2025/10/10 独自ドメイン化
04

既刊情報

すばら3ロゴ

すばら3の既刊はBOOTH、DLsite、kindle、あるいは各種イベントで入手することができます。

一部の本は、国会図書館に預けてきました
寄稿したものは、それぞれの頒布先をご確認ください。

サークルロゴは高瀬川さんがつくってくださいました。ありがとう!

05

実績

寄稿・お手伝い

  • 2023/01 「TOWER of HANOI」もらえナナシアンソロ 二次創作

    『施設長はきっとそんなこと言わない』を寄稿

  • フリーゲームのシナリオのお手伝い

  • 2022/05 「TOWER of HANOI」T2後日談アンソロ 二次創作

    『スーサイド・オーダーメイド』を寄稿

  • 2021/12 キミは何人目のカワイイ被験体?※リンク先R18 お手伝い

    R18シェアゲの探索テキストの一部をお手伝い

  • 『紫檀川』を寄稿

  • アリュージョニスト合同誌へ寄稿。サイバーカラテ道場が突如ソシャゲになる短編ギャグ

  • 2019/06 かもかて十年祭 二次創作

    トッズ愛情ルートの短編を一本寄稿

  • 『そして、物語は始まる』へ寄稿。賢者ルート(女)が古代都市から帰還したときの一幕

  • 2015/11 人外×人間アンソロジー(DIRTY LABOR様) オリジナル

    『Hallucigenia』を寄稿。悪魔×人間の人外夫婦のお話

受賞歴

技術記事コンテスト・投稿キャンペーンでの受賞歴です。

  • 2026/09 Zennコンテスト「OpenTelemetryの知見を、記事にしよう」 Splunk Observability部門 優秀賞

    【Splunk】入力は無限、請求は有限:LLMを呼び出すゲームを、Splunk Observability Cloudで見張ってもらう

  • 2026/07 Zennfes Spring 2026「TiDBで作るAI時代のデータ基盤」 最優秀賞

    【TiDB】「Hades + Slay the Spire」は何になる? Steamのゲームを足し引きして次の一本を探そう

  • 2026/07 Zennfes Spring 2026「YouCam APIを活用した実装事例とアイデア」 特別賞

    【YouCam】YouCamAPIを使って、細かすぎて伝わらないメイク当てクイズを作った

  • 2024/06 Qiita記事投稿キャンペーン「音声認識APIを使ってみよう!」 AmiVoice優秀賞

    TRPGのボイスセッションのログを感情分析して、リプレイのハイライトを作成する

06

ご依頼

スクリプトや個人サイトなど、ご入用のものがありましたらぜひお声がけください!

info★subara3.com (★→@)

07

プライバシーポリシー

最終更新: 2025/10/14

個人情報の取り扱い

お問い合わせフォームからご連絡いただいたメッセージは、必要なご連絡のためにのみ使用します。許可なく第三者に開示・提供することはありません。

Cookieの使用

サイトの利便性向上やアクセス解析のためにCookieを使用しています。ブラウザ設定で無効にできますが、一部機能が正しく動作しなくなる場合があります。

アクセス解析

Google Analyticsを使用しています。トラフィックデータは匿名で収集され、個人を特定するものではありません。

広告配信

第三者配信の広告サービス「Google AdSense」を使用しています。ユーザーの興味に応じた広告表示のためにCookieを使用することがあります。

アフィリエイト

Amazonアソシエイト・プログラム等に参加しています。

著作権

掲載コンテンツの著作権は当サイト管理者または正当な権利者に帰属します。無断転載・複製はご遠慮ください。

免責事項

情報の正確性・安全性を保証するものではありません。当サイトの内容によって生じた損害等について責任を負いかねます。