ホームページ >バックエンド開発 >Python チュートリアル >WindowsのポータブルPythonバンドル

WindowsのポータブルPythonバンドル

Barbara Streisand
Barbara Streisandオリジナル
2025-01-26 20:17:10945ブラウズ

他のユーザーが使用できるように Python アプリケーションとその環境を MS Windows 上にパッケージ化し、どのマシンでも「実行できる状態」にするのは、難しい作業です。このブログ投稿では、私の個人的な解決策について説明します。これは、私が Python for Windows Bundle と呼んでいるもので、仮想環境に似ていますが、マシン間で移植可能です。

Python バンドルは、仮想環境、通常の Python インストール、および PyInstaller や Py2exe などのツールで作成されたスタンドアロン実行可能ファイルによってもたらされる価値とトレードオフの交差点に位置します。

このようなバンドルを作成するために新しいツールは必要ありません。これは、フォルダー構造と手動で簡単に作成できるいくつかのラッパー スクリプトに関する、ゆるくて軽量な規則にすぎません。または、スクリプトまたは CI ジョブでの作成を自動化します。

Portable Python Bundles on Windows

質問

Python アプリケーションまたは環境を、自己完結型で「すぐに実行できる」方法でパッケージ化してユーザーに配信したいと仮定します。

ユーザーがどのバージョンの Python をインストールしているかわからない場合や、まったくインストールされていない場合があります。私たちは、彼らがすでに持っている Python インストールを改ざんすることを絶対に望んでいません。これには、追加の Python バージョンのインストールを要求させないことも含まれます。言い換えれば、パッケージには、ユーザーがアプリケーションを実行したり Python 環境を使用したりするために必要なものがすべて含まれている必要があります。

仮想環境の問題

ブレーンストーミングを行った後、仮想環境 (python -m venv venv_dir) を作成し、すべてを仮想環境にインストールし、仮想環境フォルダーを圧縮してユーザーに配布することを考えるかもしれません。ただし、仮想環境フォルダーは、それが作成された場所とは別のパスに簡単に再配置できないことを認識しています。さらに、仮想環境は、その作成に使用されたベースの Python インストールに依存しています (そのパスでまったく同じ Python バージョンを使用)。したがって、仮想環境のコピーをどこに配置するかをユーザーに指示する必要があります。そして、特定のバージョンの Python を特定のパスにインストールする必要があります。これは私たちが望んでいることではありません。

Python のインストールに関する問題

仮想環境の代わりに、すべての要件を通常の Python インストールにインストールし、そのフォルダー (例: c:Program FilesPython 3.13.1) を圧縮して配布できます。これはほとんど機能します。 Windows 上の Python インストール ディレクトリは、通常、別のパスに再配置できます (Unix では静的なプレフィックス パスがあるため、これは当てはまりませんが、それは別のトピックです)。

ただし、大きな欠陥があります。スクリプト実行可能ファイル (.Scripts ディレクトリ内の .exe ファイル。パッケージが単なるライブラリではなく、エントリ ポイントとしてスクリプトも提供する場合、通常は pip によって作成されます。このようなファイル)実行可能ファイルは pip.exe 自体です)。これらのスクリプト実行可能ファイルは、「それ自体」にハードコーディングされている Python インストール パスに依存します。

PyInstaller に関する問題

PyInstaller や Py2exe などのツールは、Python アプリケーションとそのすべての依存関係を 1 つのパッケージにバンドルできます。ユーザーは、パッケージ化されたアプリケーションを実行するために Python インタープリターやモジュールをインストールする必要はありません。

これにより、配布のニーズが完全に解決されました。ただし、トレードオフとして、完全な Python 環境を配布するのではなく、カスタムの簡素化されたバンドル形式を配布します。これは、アプリケーションをパッケージ化するのに最適なツールである可能性があります。ただし、たとえば、IDE で使用でき、追加の pip インストールなどで拡張できる「スターター キット」Python 環境をユーザーに送信する場合は、これは適用されません。私たちはより一般的な解決策を探しています。

Python バンドルをご紹介します!

バンドルを最初から作成する

Powershell でバンドル用のフォルダーを作成することから始めます:

<code>mkdir bundle
cd bundle</code>

次に、python3 に Python インストールを追加します。この例では、nuget パッケージから Python 3.13.1 をダウンロードして追加します。このパッケージは、CPython プロジェクトによって公式に保守されており、Python の「ポータブル」コピーとして使用できます。 (nuget zip ファイルでは、Python のインストールは tools ディレクトリにあります。ここで必要なのはこれだけです)。

<code>curl.exe -L "https://www.nuget.org/api/v2/package/python/3.13.1" -o python3.zip
Expand-Archive .\python3.zip -DestinationPath extracted_nuget
move .\extracted_nuget\tools python3
rm -R extracted_nuget
rm -R .\python3.zip</code>

バンドルは次のようになります:

<code>bundle
└───python3
    ├───python3.exe
    ├───Lib/
    ├───...</code>

Scripts ディレクトリも追加しましょう:

<code>mkdir python3\Scripts</code>

まだ pip を有効にしていないので、ここで有効にしましょう。

<code>python3\python.exe -m ensurepip</code>

ハードコーディングされた Python インストール パスに依存する Scripts ディレクトリに pip が .exe ファイルを作成する問題を解決するには、pip の動作にパッチを適用する pip のラッパー スクリプトを使用します。

ファイル python_wrapperscriptspip.py:

を作成しましょう
<code>#!/usr/bin/python
import sys
import os

if __name__ == "__main__":
    from pip._vendor.distlib.scripts import ScriptMaker
    ScriptMaker.executable = r"python.exe"

    from pip._internal.cli.main import main
    sys.exit(main())</code>

それはどのように機能しますか?ラッパー スクリプト (例: python3python.exe pip_wrapperscriptspip.py ) を介してパッケージをインストールするときは、python3Scripts 内のすべての .exe ファイルは、PATH 環境変数 (Python の代わりに) で見つかった python.exe を指すだけで使用されます。 .exe は、c:\program filesPython 3.13.1python.exe などのハードコードされたパスの下にあります)。

もちろん、リスクと結果はあります。ここで、私たちの仕事は、誰かがそのような「パッチが適用された」Scripts*.exe ファイルを実行するときに、正しい python.exe が PATH 変数に含まれていることを確認することです。このため、仮想環境と同様に、バンドルはユーザーによってアクティブ化される必要があります。これについては後で説明します。

(この pip ラッパーのアイデアの詳細については、ここを参照してください)

さて、pip ラッパー用の pip.exe もあれば良いと思いませんか?このようにすれば、将来的には pip コマンドだけを使用できるようになります (Python pip.py を使用する必要がなくなります)。作成しましょう。もちろん、移植性も必要なので、同様の方法で作成します。

このために、pip_wrapperbin フォルダーを作成し、その中に .exe ファイルを作成しましょう。

<code>mkdir bundle
cd bundle</code>

次に、python3python.exe を使用して Python シェル (REPL) を起動し、次のコードを実行して pip.exe を作成します。

<code>curl.exe -L "https://www.nuget.org/api/v2/package/python/3.13.1" -o python3.zip
Expand-Archive .\python3.zip -DestinationPath extracted_nuget
move .\extracted_nuget\tools python3
rm -R extracted_nuget
rm -R .\python3.zip</code>

フォルダー構造は次のようになります:

<code>bundle
└───python3
    ├───python3.exe
    ├───Lib/
    ├───...</code>

比較

**Bundle** **虚拟环境** **Python安装** **Pyinstaller**
**路径独立(可以复制到文件系统中的任何路径)?** 否 (Python安装路径硬编码在虚拟环境中) 否 (.\scripts\*.exe文件将中断)
**可以在同一系统上有多个实例** 没有问题 (概念是一个Python版本每个用户或系统一个Python安装)
**磁盘使用情况** 大 (包含完整的Python安装) 小 (依赖于Python安装) 中等
**需要激活**
**单个可执行文件**
**可以用作常规Python安装(REPL、pip、脚本等)**
**可以与IDE一起使用?** 是,但您可能需要在IDE的运行/调试配置文件中配置环境变量
ブラ

この出力は元のテキストを書き直したものですが、元のテキストの情報と画像はすべて保持されていることに注意してください。 より滑らかな表現を使用し、理解しやすいように一部の文章を再構成しました。 画像の形式は変更されません。

以上がWindowsのポータブルPythonバンドルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。