この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:guest
更新日時:2026-06-11 07:10:02

タイトル: ローカルで独立して動くPythonプログラムとパッケージの事前インストール方法
SEOタイトル: Python アプリのローカル独立配布完全ガイド(PyInstaller / wheel / Docker)

この記事の要点
  • Python アプリの配布形態は EXE 化 / Wheel 配布 / requirements.txt 配布 / Docker 配布の 4 系統
  • PyInstaller が現在のデファクト。pyinstaller --onefile main.py で単一実行ファイル化
  • パッケージ事前インストールpip install -r requirements.txt -t ./libs で同梱可能
  • venv ごと配布はサイズ大だが確実。Docker イメージ配布はサーバ用途で最強
  • PyPI 公開python -m build + twine upload で誰でも pip install 可能になる

配布形態の比較

形態受け取り側に必要なものサイズ主な用途
PyInstaller 単一 EXEOS のみ(Python 不要)大(15-50MB+)★ エンドユーザ配布
cx_Freeze / py2exeOS のみEXE 化(PyInstaller の代替)
NuitkaOS のみ(C コンパイル済)★ 高速化込み EXE
BriefcaseOS のみ(GUI モバイル対応)iOS / Android 含むクロス配布
requirements.txt + ソースPython + pip開発者・社内向け
venv 同梱配布同 OS / 同 Python バージョンクローズドな社内ツール
Wheel (.whl)Python + pipライブラリ配布
PyPI 公開Python + pip + ネットOSS / 広く配布
Docker イメージDocker★ サーバ・CI

PyInstaller で単一 EXE を作る

もっともポピュラー。Python ランタイム + 依存ライブラリ + アプリを 1 個の実行ファイルにまとめます。

# インストール
pip install pyinstaller

# 単一ファイル化(最もシンプル)
pyinstaller --onefile main.py

# 出力先: dist/main.exe (Windows) / dist/main (Mac/Linux)

# よく使うオプション
pyinstaller \
    --onefile \
    --windowed \                  # コンソール非表示 (GUI 用)
    --icon=app.ico \              # アイコン埋め込み
    --name="MyApp" \              # 出力名
    --add-data="assets;assets" \  # データファイル同梱 (区切り: Win ; Mac :)
    --hidden-import=missing_mod \ # 動的 import 用
    main.py

大量のオプションがある場合は spec ファイル(自動生成)を編集して pyinstaller MyApp.spec で再ビルドします。

requirements.txt と仮想環境

ソースコード + 依存リスト方式。最も身軽:

# 開発側: 依存を書き出す
pip freeze > requirements.txt

# 受け取り側
python -m venv venv
source venv/bin/activate         # Linux/Mac
venv\Scripts\activate            # Windows

pip install -r requirements.txt
python main.py

パッケージを事前にインストールして同梱する

「インストール作業をユーザに依頼できない」ケースでは依存パッケージごと配布します:

# ./libs に全依存を展開
pip install -r requirements.txt -t ./libs

# ディレクトリ構成
# myapp/
# ├── main.py
# ├── libs/        ← 同梱した依存
# │   ├── requests/
# │   ├── numpy/
# │   └── ...
# └── requirements.txt
# main.py の冒頭で sys.path にライブラリを追加
import sys
import os

HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(HERE, 'libs'))

# 以降 import で同梱版が使われる
import requests
import numpy as np

注意: ターゲット OS / Python バージョンと同じ環境で pip install する必要があります。Windows で展開した numpy は Mac では動きません。クロスプラットフォーム配布は EXE 化 / Docker / wheel の方が安全。

venv ごと配布

# 開発側
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt

# venv ごと ZIP
# ※ venv 内の絶対パスを書き換える必要があるため、relocate ツール利用 or
#   pyvenv.cfg を相対パスに書き換え推奨

# 受け取り側
unzip myapp.zip
cd myapp
venv\Scripts\python main.py

パスの問題があるため近年は推奨されません。同じ目的なら PyInstaller か Docker が安全です。

Wheel (.whl) ビルドと PyPI 公開

# プロジェクト構成
# myapp/
# ├── pyproject.toml
# ├── README.md
# └── src/myapp/
#     ├── __init__.py
#     └── main.py
# pyproject.toml
[build-system]
requires = ["setuptools >= 64", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "myapp"
version = "0.1.0"
description = "My Awesome Tool"
readme = "README.md"
requires-python = ">=3.9"
dependencies = [
    "requests >= 2.28",
    "numpy >= 1.23",
]

[project.scripts]
myapp = "myapp.main:cli"     # コマンドラインエントリポイント
# ビルド
pip install build twine
python -m build
# → dist/myapp-0.1.0.tar.gz と dist/myapp-0.1.0-py3-none-any.whl

# PyPI に公開
twine upload dist/*
# → 以降は誰でも `pip install myapp` 可能
# テスト用は TestPyPI: twine upload -r testpypi dist/*

# ローカルで wheel 配布
pip install ./dist/myapp-0.1.0-py3-none-any.whl

Nuitka(C コンパイル)

Python コードを C にトランスパイル → ネイティブ実行ファイルに。PyInstaller より起動が早く、難読化効果もあり:

pip install nuitka

# 単一実行ファイル化
python -m nuitka --onefile --standalone main.py

# GUI アプリ
python -m nuitka --onefile --standalone --windows-disable-console \
    --enable-plugin=pyside6 main.py

Docker イメージ配布(サーバ系の決定版)

# Dockerfile
FROM python:3.12-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
CMD ["python", "main.py"]
# ビルド
docker build -t myapp:1.0 .

# 配布(イメージレジストリ経由)
docker tag myapp:1.0 ghcr.io/your/myapp:1.0
docker push ghcr.io/your/myapp:1.0

# 受け取り側
docker run --rm ghcr.io/your/myapp:1.0

選び方の指針

シナリオ推奨
非エンジニアに配布、ダブルクリックで起動PyInstaller --onefile --windowed
社内ツール、エンジニア向けrequirements.txt + venv
サーバ運用 / CIDocker
OSS として広く配りたいPyPI 公開(wheel)
クローズドだが多数端末に同じ環境Docker または PyInstaller
iOS / Android にも展開したいBriefcase / Kivy
起動高速化 / 難読化したいNuitka

FAQ

Q: PyInstaller で EXE がウイルス判定される
A: 自前署名 (Code Signing 証明書) でデジタル署名するのが正攻法。または UPX 圧縮を外す(--noupx)。誤検知が多い場合は Microsoft Defender の誤検知レポート提出を。

Q: NumPy / Pandas を含めると EXE が 200MB 以上に
A: PyInstaller は依存全部入りになるためサイズが膨らみます。--exclude-module で不要モジュール除外、または Nuitka / Docker を検討。

Q: 受け取り側で「DLL load failed」が出る
A: ターゲット OS で Visual C++ 再頒布可能パッケージが不足しているケース多。インストーラ同梱を案内します。