スタンドアロンの Python アプリの開発が困難な理由

便利な Python ツールを作るのに数週間を費やしたとします。自分のマシンでは完璧に動作します。それをチームメイトと共有しようとすると、相手に Python がインストールされていないため失敗します。

これはよくある悩みです。Python を、どこでも動作する単一のファイルにパッケージ化するのは困難です。単に requirements ファイルが足りないというだけの問題ではありません。

問題は Python の仕組みから始まります。

Python は動的言語です。プログラムの実行中に多くの決定を下します。ライブラリを即座にインポートしたり、実行中に関数の動作を変更したりすることができます。

Go や Rust のようなコンパイル言語は、プログラムが開始される前にすべてを決定します。未使用のコードを削ぎ落とし、小さくて高速なファイルを作成します。

Python にはこれができません。コードがランタイムのどの部分を必要とするかを簡単に予測することはできません。確実に動作させるためには、Python ランタイム全体を含める必要があります。

これがライブラリの問題につながります。

他の言語では、コンパイラが tree-shaking を使用してファイルを小さく保ちます。Python ではこれが使えません。すべての依存関係と、そのすべてのサブ依存関係を含める必要があります。また、コンパイル済みのバイナリファイルも含めなければなりません。その結果、小さなスクリプトが 300MB のパッケージになってしまいます。

主な選択肢は 3 つあります:

  • ターゲットマシンに Python のインストールを要求する。これは開発者には機能しますが、一般ユーザーには向きません。
  • インタプリタを同梱する。PyInstaller や Nuitka のようなツールは、ランタイムをアプリにパッケージ化します。PyInstaller は普及しています。Nuitka は、速度を向上させるためにコードを C に変換します。
  • Docker を使用する。これはオペレーティングシステム層全体を含めることで、完全な信頼性を提供します。サーバーには適していますが、ファイルサイズが大きくなります。

PyApp のような新しいツールは、中間的な解決策を提供します。これらは小さなランチャーを使用して、適切な Python バージョンを自動的にダウンロードします。

選び方:

• 技術チーム向け:仮想環境と requirements ファイルを使用する。 • 非開発者向け:PyInstaller を使用する。これが最もテストされた方法です。 • サーバーやデータパイプライン向け:Docker を