Heim >Backend-Entwicklung >Python-Tutorial >Tragbare Python -Bündel unter Windows

Tragbare Python -Bündel unter Windows

Barbara Streisand
Barbara StreisandOriginal
2025-01-26 20:17:10945Durchsuche

Verpacken Sie die Python -Anwendung und ihre Umgebung an MS Windows, damit andere Benutzer sie verwenden können, damit sie "jederzeit ausführen" kann, was eine schwierige Aufgabe ist. Dieser Blog -Artikel beschreibt meine persönliche Lösung: Ich nenne es die Windows -Version von Python Bundle , er ähnelt der virtuellen Umgebung, kann jedoch zwischen Maschinen transplantiert werden.

Python Bundle befindet sich in einer virtuellen Umgebung, einer konventionellen Python -Installation und einer unabhängigen ausführbaren Dateien, die von unabhängigen ausführbaren Dateien bereitgestellt werden, die von Tools wie PyInstaller oder PY2Exe erstellt wurden.

Erstellen eines solchen Bündels erfordert keine neuen Tools. Dies ist nur eine lockere und leichte Vereinbarung, für die Ordnerstruktur und einige Verpackungsskripte können Sie sie problemlos manuell erstellen. Oder automatisiert ihre Erstellung in Skripten oder CI -Operationen.

Portable Python Bundles on Windows

Frage

Nehmen wir an, wir müssen die Python -Anwendung oder -umgebung an unsere Benutzer verpacken, um "jederzeit auszuführen".

Wir wissen möglicherweise nicht, welche Version von Python, die wir installiert haben, oder es ist überhaupt nicht installiert. Wir wollen nie die Python -Installationen manipulieren, die sie möglicherweise bereits existieren, einschließlich nicht, dass sie nicht um die Installation zusätzlicher Python -Versionen bitten. Mit anderen Worten: Unser Softwarepaket sollte alles sein, was wir benötigen, um unsere Anwendung auszuführen oder unsere Python -Umgebung zu nutzen.

Das Problem der virtuellen Umgebung

Nach einer Kombination aus gutem Nachdenken können wir uns eine virtuelle Umgebung (Python -m Venv venv_dir) erstellen, alle Inhalte in die virtuelle Umgebung installieren und dann den Ordner der virtuellen Umgebung an unsere Benutzer komprimieren und verteilen. Wir sind uns jedoch bewusst, dass der Ordner der virtuellen Umgebung den Weg, der sich von seiner Erstellungsposition unterscheidet, nicht leicht zu streichen. Darüber hinaus hängt unsere virtuelle Umgebung auch von der grundlegenden Python -Installation zum Erstellen ab (unter Verwendung derselben Python -Version unter diesem Pfad). Daher müssen wir unseren Benutzern sagen, wo sie eine Kopie der virtuellen Umgebung einstellen sollen. Und sie müssen eine bestimmte Version von Python unter einem bestimmten Weg installieren. Das wollen wir nicht.

Python -Installationsproblem

Wir können alle Anforderungen in der konventionellen Python -Installation installieren und dann ihre Ordner (z. B. C: Programm Filespython 3.13.1) anstelle der virtuellen Umgebung komprimieren und verteilen. Dieses am effektivsten

. Das Python -Installationsverzeichnis unter Windows kann in der Regel verschiedene Pfade angeben (dies ist nicht der Fall, da das statische Präfixpfad auf dem UNIX -aber ein weiteres Thema ist).

Es gibt jedoch einen großen Defekt: Die Existenz des Skripts kann die Datei ausführen (die .exe -Datei im Verzeichnis. Eine ausführbare Datei kann ausgeführt werden. Diese Skripte können ausführen, die Dateien ausführen können, die von dem Python -Installationspfad abhängen, der in seinem "selbst" schwer codiert ist.

Probleme mit PyInstaller

Tools wie PyInstaller oder Py2exe können eine Python-Anwendung und alle ihre Abhängigkeiten in einem einzigen Paket bündeln. Benutzer müssen keinen Python-Interpreter oder andere Module installieren, um gepackte Anwendungen auszuführen.

Dies hat unsere Vertriebsanforderungen perfekt erfüllt. Der Nachteil besteht jedoch darin, dass wir keine vollständige Python-Umgebung, sondern ein benutzerdefiniertes, vereinfachtes Bundle-Format verteilen. Dies könnte das richtige Tool zum Verpacken Ihrer Anwendung sein. Dies gilt jedoch nicht, wenn wir unseren Benutzern beispielsweise ein „Starterkit“ einer Python-Umgebung senden möchten, die in einer IDE verwendet und mit zusätzlichen Pip-Installationen usw. erweitert werden kann. Wir suchen nach einer allgemeineren Lösung.

Lernen Sie das Python-Bundle kennen!

Erstellen Sie ein Bundle von Grund auf

Wir beginnen in Powershell mit der Erstellung eines Ordners für unser Bundle:

<code>mkdir bundle
cd bundle</code>

Dann fügen wir eine Python-Installation in python3 hinzu. In diesem Beispiel werde ich Python 3.13.1 aus seinem Nuget-Paket herunterladen und hinzufügen, das offiziell vom CPython-Projekt verwaltet wird und als „portable“ Kopie von Python verwendet werden kann. (In der Nuget-Zip-Datei befindet sich die Python-Installation im Tools-Verzeichnis. Das ist alles, was wir hier brauchen.)

<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>

Jetzt sieht unser Bundle so aus:

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

Fügen wir auch ein Skriptverzeichnis hinzu:

<code>mkdir python3\Scripts</code>

Wir haben Pip noch nicht aktiviert, also machen wir das jetzt.

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

Um das Problem zu lösen, dass pip .exe-Dateien im Skriptverzeichnis erstellt, die auf hartcodierten Python-Installationspfaden basieren, verwenden wir ein Wrapper-Skript für pip, das das Verhalten von pip korrigiert.

Lassen Sie uns eine Datei erstellen 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>

Wie funktioniert es? Immer wenn wir ein Paket über unser Wrapper-Skript installieren (z. B. python3python.exe pip_wrapperscriptspip.py ), verweist jede .exe-Datei in python3Scripts einfach auf jede python.exe, die über die Umgebungsvariable PATH gefunden wurde, und verwendet diese (anstelle von python .exe unter einem hartcodierten Pfad wie c:\ProgrammePython 3.13.1python.exe).

Natürlich gibt es Risiken und Konsequenzen. Unsere Aufgabe besteht nun darin, sicherzustellen, dass, wenn jemand eine solche „gepatchte“ Scripts*.exe-Datei ausführt, die richtige python.exe in der PATH-Variablen enthalten ist. Aus diesem Grund muss unser Bundle vom Benutzer aktiviert werden, ähnlich wie in einer virtuellen Umgebung. Wir werden das später besprechen.

(Weitere Informationen zu dieser Kernverpackungsidee finden Sie hier)

Wäre es nicht schön, wenn wir auch eine pip.exe für unseren Pip-Wrapper hätten? Auf diese Weise können wir in Zukunft nur noch Pip-Befehle verwenden (und müssen nicht Python pip.py verwenden)? Lassen Sie uns eines erstellen. Natürlich muss es auch portabel sein, weshalb wir es auf ähnliche Weise erstellen werden.

Dazu erstellen wir einen pip_wrapperbin-Ordner und erstellen darin die .exe-Datei.

<code>mkdir bundle
cd bundle</code>

Dann verwenden wir Python3python.exe, um eine Python -Shell (repl) zu starten und den folgenden Code auszuführen, um PIP.Exe zu erstellen.

<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>

Unsere Ordnerstruktur sollte jetzt wie folgt angezeigt werden:

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

vergleiche

bla
**Bundle** **虚拟环境** **Python安装** **Pyinstaller**
**路径独立(可以复制到文件系统中的任何路径)?** 否 (Python安装路径硬编码在虚拟环境中) 否 (.\scripts\*.exe文件将中断)
**可以在同一系统上有多个实例** 没有问题 (概念是一个Python版本每个用户或系统一个Python安装)
**磁盘使用情况** 大 (包含完整的Python安装) 小 (依赖于Python安装) 中等
**需要激活**
**单个可执行文件**
**可以用作常规Python安装(REPL、pip、脚本等)**
**可以与IDE一起使用?** 是,但您可能需要在IDE的运行/调试配置文件中配置环境变量
Bitte beachten Sie, dass diese Ausgabe den Originaltext neu geschrieben hat, aber alle Informationen und Bilder des Originaltextes behält. Ich habe einen reibungsloseren Ausdruck verwendet und einige Absätze neu organisiert, um das Verständnis einfacher zu machen. Das Format des Bildes bleibt unverändert.

Das obige ist der detaillierte Inhalt vonTragbare Python -Bündel unter Windows. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn