Raspberry Pi 4BでPythonプログラムをバイナリにパッケージ化する方法

PyInstallerのインストールができません。ラズベリーパイでPythonファイルをバイナリ実行可能ファイルとしてパッケージ化する他の方法はありますか?

pipを使用してpyinstallerをインストールできます。

pip install pyinstaller

参考:https://www.cnblogs.com/wendaobiancheng/p/9772509.html

このコマンドを使用すると、以下のエラーが発生し、インストールは失敗します。

pip install pyinstaller
error: externally-managed-environment

× この環境は外部によって管理されています
╰─> Pythonパッケージをシステム全体にインストールするには、apt install
python3-xyz を試してください。ここで xyz はインストールしようとしている
パッケージです。

Debianパッケージ化されていないPythonパッケージをインストールしたい場合は、
python3 -m venv path/to/venv を使って仮想環境を作成してください。
その後、path/to/venv/bin/python と path/to/venv/bin/pip を使用します。
python3-full がインストールされていることを確認してください。

詳細については http://rptl.io/venv を参照してください。

注: これが誤りであると思われる場合は、PythonのインストーラーまたはOSのディストリビューション提供元にお問い合わせください。--break-system-packages を指定することで上書きできますが、その場合PythonのインストールやOSが壊れるリスクがあります。
ヒント: 詳細な仕様についてはPEP 668を参照してください。

このコマンドを使用しています:sudo apt install python3-pyinstaller

対応するインストールパッケージが見つかりません。
パッケージリストを読み込んでいます… 完了
依存関係ツリーを構築しています… 完了
状態情報を読み取りました… 完了
E: パッケージ ‘python3-pyinstaller’ が見つかりません

https://www.cnblogs.com/clark1990/p/17942952

pipx を使用してインストールすることを推奨します

Raspberry Pi 4B 上では、PyInstaller が使えない場合、最も強力な代替手段は Nuitka です。PyInstaller が単なる「パッケージング」であるのに対し、Nuitka は Python コードを C コードに変換して、真のマシン語バイナリにコンパイルします。

以下は、Raspberry Pi 上で Python をバイナリファイルにパッケージングするための一般的な方法です:


1. Nuitka(最も推奨:高性能、真のコンパイル)

Nuitka は現在の Python コミュニティで非常に人気のあるパッケージングツールであり、特に Raspberry Pi のような Linux 環境での実行に適しています。生成されたバイナリファイルは、通常、元の Python よりも高速に動作します。

インストール手順:

  1. 最初に必要な C コンパイラをインストールします(Raspberry Pi システムには通常標準搭載されていますが、更新することをおすすめします):
sudo apt update
sudo apt install build-essential python3-dev
  1. Nuitka をインストールします:
pip install nuitka

パッケージングコマンド:

プログラムがあるディレクトリで以下のコマンドを実行します:

python3 -m nuitka --standalone --onefile --remove-output your_script.py
  • --standalone:すべての依存ライブラリを含めます。
  • --onefile:すべての内容を1つの実行可能ファイルにまとめます。
  • --remove-output:コンパイル後に一時的に生成された C コードのフォルダを削除します。

2. cx_Freeze(成熟した安定代替案)

Nuitka のコンパイル時間が長すぎると感じる場合(複雑な最適化処理を行うため)、cx_Freeze は PyInstaller に近い選択肢です。

インストール手順:

pip install cx_Freeze

使用方法:

setup.py という名前のファイルを作成します:

from cx_Freeze import setup, Executable

setup(
    name = "私のプログラム",
    version = "1.0",
    description = "説明",
    executables = [Executable("your_script.py")]
)

その後、ターミナルで以下を実行します:

python3 setup.py build

これにより、build フォルダ内に実行可能ファイルとその依存ライブラリを含むフォルダが生成されます。


3. Shiv (Zipapp方式:軽量)

厳密な意味での「暗号化・マシン語バイナリ」ではなく、「1ファイルでの配布」が目的であれば、Shiv は非常に優れた選択肢です。これは Python 標準の zipapp 機能を利用しています。

使用方法:

pip install shiv
shiv -e your_module.main -o my_app .

これにより、コードとすべての依存ライブラリが巨大な .pyz ファイルに圧縮されます(Linux では ./my_app のように直接実行権限を付けて実行できます)。利点はパッケージングが非常に速く、極めて安定していることです。


4. なぜ PyInstaller がインストールできないのか?(よくある修復法)

Raspberry Pi で PyInstaller のインストールに失敗する主な原因は、binutilsPython 開発用ライブラリが不足していることです。もう一度試す場合は、まず以下を実行してください:

sudo apt install python3-dev binutils libffi-dev
pip install pyinstaller

エラーメッセージに arm-linux-gnueabihf-gcc といった内容が含まれる場合、たいてい build-essential が不足しています。


方式比較

ツール 原理 利点 欠点
Nuitka Cコードにコンパイル 実行速度が速く、コードの逆コンパイルが困難、真のバイナリ コンパイル時間長い、複雑なライブラリとの互換性調整が必要
cx_Freeze 環境をフリーズ (Freeze) 設定が柔軟、クロスプラットフォーム対応が良い 生成されるのはフォルダ(AppImage と組み合わせないと単一ファイルにならない)
Shiv 圧縮パッケージ (Zipapp) すべてのライブラリと完全互換、パッケージングが極めて高速 宛先マシンに Python インタプリタのインストールが必要

おすすめ:
プログラムの安全性とパフォーマンスを重視するなら Nuitka を使用してください。一方、素早くパッケージングしたい上に、実行環境に Python があるかどうか気にしないのであれば、Shiv を使うのが良いでしょう。