どこでも動く!依存関係ゼロのポータブルなPython環境の作り方
Self-contained highly-portable Python distributions
Self-contained highly-portable Python distributions
環境依存にサヨナラ!他のPCへ持っていってもそのまま動く、自己完結型のポータブルなPython配布パッケージを作成するテクニックを解説します。
これらのディストリビューションを使っているユーザーなら、姉妹プロジェクトであるPyOxy [1] の方が役立つかもしれない。PyOxyはこうしたPythonディストリビューションを取り込み、Pythonインタプリタの機能を強化するRustコードを追加するものだ。公式のPyOxyリリースバイナリは単一ファイルの実行形式になっていて、フル機能のPythonインタプリタとして使える。
1: https://github.com/indygreg/PyOxidizer/
READMEを見ると、PyOxyにはいくつか関連する用途があるみたいだ。
インタプリタを含めたPythonアプリ全体を単一の実行ファイルにできる
自己完結型のPythonインタプリタなどを配布して、より大きなアプリケーション内に埋め込んだりライブラリとして使ったりできる
PyOxidizerはRustとPythonの架け橋としても機能する。「PyOxidizerを使えばRustプロジェクトにPythonインタプリタを簡単に組み込める。逆もまた然りで、PythonにRustを追加することも可能だ」
これらのディストリビューションは素晴らしいよ。Astralが少し前にメンテナンスを引き継いだので、技術的には今はOpenAIの傘下にあることになる。
https://github.com/astral-sh/python-build-standalone
もしPythonを他のアプリケーション(例えばmacOSのデスクトップアプリなど)にバンドルしたいなら、まさにこれが必要になるはず。
これらはuv (https://github.com/astral-sh/uv) で使っているPythonディストリビューションだ。つまり、uvでPythonをインストールすると、python-build-standaloneからインストールされることになる。(pipx、Hatch、Poetry、Bazelなど、Pythonをインストールできる他のツールの多くも同じことだ。)
ここ1年半ほど、プロジェクトへのエンジニアリング工源のほとんどは、以下の3つに注力してきた。
上流のCPythonに追従すること。(この作業の多くをCPython自体に取り込んでもらえるよう働きかけている。)
CPythonに関連する既知の「クセ」をすべて修正すること。
これらのディストリビューションを他のどのCPythonディストリビューションよりも高速(あるいは同等)にすること。
もし興味があれば、メンテナンスを引き継いだ時の理由や経緯について書いたので、ここを見てみてほしい: https://x.com/charliermarsh/status/1864050698574311561
APE/Cosmopolitanのクロスプラットフォームバイナリもあるよね。これにはpythonが含まれている。そう、クロスプラットフォームバイナリなんだ。このバイナリは「Linux + Mac + Windows + FreeBSD + OpenBSD 7.3 + NetBSD + BIOSでネイティブに動作し、考えうる最高のパフォーマンスと最小のフットプリントを実現する」ものだ。
Pythonソース: https://github.com/jart/cosmopolitan/tree/master/third_party/python
Pythonバイナリ: https://cosmo.zip/pub/cosmos/bin/python (約40MB)
どうやら.pyファイルをPythonバイナリと一緒にzipにまとめれば実行できるみたいだけど、まだ試してみる機会がないんだ。
重要な違いは、自己完結型だからといって「どこでも動く単一のバイナリ」になるわけではない……ということだよね?
virtualenvは依然としてホストのインタプリタとOSに依存している。
これらのディストリビューションはインタプリタや標準ライブラリ、ほとんどのランタイム依存関係を固定するけれど、残りの境界線で本番環境での驚き(トラブル)が起きるんだ。
例えばmuslビルドはlibcへの依存を排除するけど、一般的な.so拡張をロードできなくなる。
uvがこれをメンテナンスすることが重要だというのはよくわかる。再現性のあるPythonベースを提供しつつ、プラットフォーム固有の拡張レイヤーをデプロイ時の決定事項として明確に分離できるからだ。
この急なAstralの売り込みは何なの?
Astralのパッケージキャッシュプロキシか何かが、OpenAIやHuggingfaceのインシデントの原因だったりしたのか?
Sublime Textが使っているのもこれじゃない?
700MBよりは小さいの?
デスクトップ環境で動かすためにPythonとライブラリをWASMにコンパイルすることを検討しているんだ。元々がPythonだし、パフォーマンスが大幅に落ちても構わない。ただ、PyInstallerよりもう少し扱いやすい形でコードをパッケージ化したいだけなんだ。