Website-Suche

Wie man Python-Anwendungen verpackt und vertreibt


Einführung

Alle Python-Bibliotheken (d.h. Anwendungs-Pakete), die Sie mit einem Paketmanager (z.B. pip) herunterladen, werden mit einem Dienstprogramm verteilt, das speziell für diese Aufgabe entwickelt wurde. Diese Dienstprogramme erstellen "Python-Distributionen", die im Grunde genommen versionierte (und komprimierte) Archive sind. Alle verwandten Elemente, die vertrieben werden, wie Quell- und Ressourcen-Dateien, sind darin enthalten.

In diesem DigitalOcean-Artikel werden wir über die notwendigen Werkzeuge für die Verteilung sprechen und die wichtigsten Schritte durchgehen, um Ihnen zu ermöglichen, Ihre eigenen nützlichen Bibliotheken, Module oder Anwendungen zu verpacken - was Ihnen beim Bereitstellen Ihres Projekts auf einem Droplet oder beim Teilen im Internet helfen sollte.

Python-Distributionen und -Pakete

Selbst wenn Sie nur ein wenig mit Python gearbeitet haben, werden Sie mit dem Konzept vertraut sein, einen Paketmanager (z. B. pip, easy_install) zu verwenden, um Module und Bibliotheken (z. B. Entwicklung von Anwendungsrahmen) herunterzuladen, die dann importiert und verwendet werden, um ein neues zu erstellen.

Diese Paketverwaltungstools, die lokal arbeiten, verbinden sich mit einer Quelle (d.h. Python Package Index - PyPI) und führen eine gewünschte Aktion (z.B. suchen und installieren) aus, während sie mit diesen Ressourcen arbeiten, die tatsächlich als Python-Distributionen bezeichnet werden.

Der Weg, eine Anwendung zu verteilen, besteht darin, ihr Verzeichnis mit einigen unverzichtbaren Dateien (neben ein paar empfohlenen) zu umhüllen, relevante Elemente (z. B. Ressourcen, Abhängigkeiten usw.) anzugeben und sie zu veröffentlichen oder anderswo zu verwenden ... so einfach.

Hinweis: Es wird dringend empfohlen, mit virtuellen Umgebungen zu arbeiten, um Python-Downloads, -Module und Anwendungen, mit denen Sie arbeiten, zu isolieren.

Python-Pakete

In Python ist ein Paket [technisch] ein importierbares Verzeichnis (mit __init__.py), das Quell-Dateien (d.h. Module) enthält. Dies sollte nicht mit Betriebssystempaketen verwechselt werden, die [technisch] tatsächliche Anwendungen sind (d.h. ein Debian-Paket). Es muss jedoch angemerkt werden, dass Python-Distributionen ebenfalls als Pakete bezeichnet werden.

Beispielpaketstruktur:

package
  |
  |-- __init__.py

Python-Anwendungen

Obwohl alles von einer einzelnen Datei bis hin zu einer mit Hunderten, die über verschiedene Pakete verteilt sind, in Python als Anwendung betrachtet werden kann, wird eine Anwendung in den meisten realistischen Szenarien aus mehreren Modulen und einer bestimmten Menge an externen Imports (aus Bibliotheken) bestehen.

Beispielanwendungsstruktur:

myapp
  |
  |-- __init__.py
  |-- amodule.py
  |-- anothermod.py
  |__ tests
  |     |
  |     |-- __init__.py
  |     |-- ..
  |     |-- .
  | ..

Python-Verteilungstools und Bibliotheken

Angesichts der beliebten Natur von Python und der Vielzahl an Drittanwendungen und -bibliotheken, die dafür geschrieben wurden, war ein einfacherer und einheitlicherer Weg zur Verbreitung schon immer notwendig. Es gab mehrere verschiedene Werkzeuge und Bibliotheken, die zur Erstellung von Python-Distributionen verwendet wurden.

Um die Aufgaben der Verteilung zu bewältigen, wurde das Python-Verteilungstools distutils erstellt.

Python-Paket-Index (PyPI)

Der Python Package Index, oder PyPI, ist ein zentrales [Online-]Repository für Projekte (Python-Distributionen). Paketverwaltungswerkzeuge wie pip verwenden dieses Repository, um sie zu hosten, zu finden und zu installieren.

Erste Schritte

Lass uns mit der Erstellung einer einfachen, allgemeinen Python-Flask-Anwendung [Struktur] beginnen, die wir dann zur Paketierung verwenden können.

Die Anwendungsstruktur erstellen

Wir haben das Ziel, ein Beispiel zu schaffen, das den meisten realen Projekten ähnelt. Daher ist es am besten, sich ein Szenario mit modularen Komponenten vorzustellen.

Beispielstruktur:

/MyApplication
    |-- run.py
    |-- config.py
    |__ /app
         |-- __init__.py
         |-- /module_one
             |-- __init__.py
             |-- controllers.py
             |-- models.py                
         |__ /templates
             |-- module_one
                 |-- hello.html
         |__ /static
         |__ ..
         |__ .

Erstelle die Ordner:

mkdir ~/MyApplication
cd    ~/MyApplication
touch run.py
touch config.py
mkdir app
cd    app
touch __init__.py
mkdir templates
mkdir static
mkdir module_one
cd    module_one
touch __init__.py
touch controllers.py
touch models.py
cd    ../templates
mkdir module_one
cd    module_one
touch hello.html

Bearbeite run.py mit nano:

nano ~/MyApplication/run.py

Platzieren Sie die Inhalte:

Run a test server.
from app import app
app.run(debug=True)

Speichern und beenden Sie mit STRG+X und bestätigen Sie mit Y.

Konfiguriere config.py mit nano:

nano ~/MyApplication/config.py

Platzieren Sie die Inhalte:

DEBUG = True

THREADS_PER_PAGE = 4

CSRF_ENABLED     = True
CSRF_SESSION_KEY = "secret"

Speichern und beenden Sie mit CTRL+X und bestätigen Sie mit Y.

Bearbeite app/init.py mit nano:

nano ~/MyApplication/app/__init__.py

Platzieren Sie die Inhalte:

from flask import Flask, render_template

app = Flask(__name__)
app.config.from_object("config")

from app.module_one.controllers import module_one

app.register_blueprint(module_one)

Speichern und beenden Sie mit STRG+X und bestätigen Sie mit Y.

Bearbeiten Sie die Datei app/module_one/controllers.py mit nano:

nano app/module_one/controllers.py

Platzieren Sie die Inhalte:

from flask import Blueprint, request, render_template

module_one = Blueprint("auth", __name__, url_prefix="/auth")

@module_one.route("/hello")
def hello():
    return render_template("module_one/hello.html")

Speichern und beenden Sie mit CTRL+X und bestätigen Sie mit Y.

Platzieren Sie die Inhalte:

Bearbeiten Sie app/templates/module_one/hello.html mit nano:

nano app/templates/module_one/hello.html

Platzieren Sie die Inhalte:

 <!DOCTYPE html> <html lang="de"> <head> <title>{% block title %}Meine Seite{% endblock %}</title> {% block css %} {% endblock %} <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> Hallo, Welt! </body> </html> </pre>

Speichern und beenden Sie mit STRG+X und bestätigen Sie mit Y.

Beginnend mit der Anwendungsdistribution/Verpackung

Nachdem wir eine beispielhafte Anwendungsstruktur einer Webseite, die Flask verwendet, erstellt haben, können wir mit dem ersten Schritt zur Vorbereitung der Verteilung fortfahren.

Ändern der Ordnerstruktur

Um unsere Anwendung gut zu verpacken, müssen wir einige Ergänzungen zu unserer Ordnerstruktur vornehmen.

/MyApplication
    |-- run.py
    |__ /app
         |-- __init__.py
         |-- /module_one
             |-- __init__.py
             |-- controllers.py
             |-- models.py                
         |__ /templates
             |-- module_one
                 |-- hello.html
         |__ /static
         |__ ..
         |__ .
    |-- setup.py    # Distribution setup file
    |-- README.txt  # Read-me file
    |-- MANIFEST.in # Distribution manifest file
    |-- CHANGES.txt # Changes log

Ändern Sie die Ordnerstruktur, um die erforderlichen Dateien zu erstellen:

touch ~/MyApplication/setup.py
touch ~/MyApplication/README.py
touch ~/MyApplication/MANIFEST.py
touch ~/MyApplication/CHANGES.py
mv    ~/MyApplication/run.py ~/MyApplication/bin/run

Erstelle die setup.py

nano ~/MyApplication/setup.py

Platzieren Sie die untenstehenden selbsterklärenden Inhalte:

from distutils.core import setup

setup(
    # Application name:
    name="MyApplication",
    
    # Version number (initial):
    version="0.1.0",
    
    # Application author details:
    author="name surname",
    author_email="name@addr.ess",
    
    # Packages
    packages=["app"],
    
    # Include additional files into the package
    include_package_data=True,
    
    # Details
    url="http://pypi.python.org/pypi/MyApplication_v010/",
    
    #
    # license="LICENSE.txt",
    description="Useful towel-related stuff.",
    
    # long_description=open("README.txt").read(),
    
    # Dependent packages (distributions)
    install_requires=[
        "flask",
    ],
)

Speichern und beenden Sie mit STRG+X und bestätigen Sie mit Y.

Erstelle die MANIFEST.in

Wenn Sie zusätzliche Verzeichnisse (z. B. statische Dateien oder Vorlagen) versenden müssen, müssen Sie diese ausdrücklich im Manifest angeben, das verpackt werden soll. Wir werden dies im MANIFEST.in tun.

nano ~/MyApplication/MANIFEST.in

Platzieren Sie die untenstehenden selbsterklärenden Inhalte:

recursive-include app/templates *
recursive-include app/static *

Speichern und beenden Sie mit STRG+X und bestätigen Sie mit Y.

Und das war's! Ihr Python-Verpackungspaket ist bereit zur Installation und Auslieferung.

Zusätzliche Dateien

Bitte denken Sie daran, dass Ihre Datei/Verzeichnis für eine vollständige Verteilung enthalten und verlinkt sein muss:

  • README.txt
  • MANIFEST.in
  • LICENSE.txt

Arbeiten mit der vertriebsbereiten Anwendung

Nachdem wir die Erstellung unserer Anwendung abgeschlossen und die notwendigen Änderungen an der Datei-Struktur vorgenommen haben, um sie für einen fehlerfreien Vertriebsbuild vorzubereiten, können wir mit den Verpackungsoperationen beginnen.

Wie man die Distributionsdatei erstellt

Um eine Verteilungsdatei-Kopie zu erstellen, führen Sie Folgendes aus:

cd     ~/MyApplication
python setup.py sdist

Dieser Befehl wird dein Setup durchgehen, die durchgeführten Operationen ausdrucken und ein Tar-Archiv im neu erstellten dist-Verzeichnis generieren, ähnlich wie:

root@hostname:~/MyApplication# ls dist
MyApplication-0.1.0.tar.gz

Hinweis: Da wir nicht alle Unterordner (d.h. statisch) gefüllt haben und mit zusätzlichen Dateien (z.B. README.txt) gearbeitet haben, können während des Erstellungsprozesses einige Warnungen auftreten.

Wie man die Anwendung installiert

Ab jetzt kann Ihre Anwendung von anderen mit der erstellten setup.py Datei installiert und verwendet werden.

Um die Anwendung zu installieren, führen Sie Folgendes aus:

python setup.py install

Wenn diese Installation für die Entwicklung gedacht ist und die Anforderungen ebenfalls installiert werden sollen, führen Sie Folgendes aus:

python setup.py develop

Wie man Ihre Anwendung teilt

Wenn Sie Ihren Code im Python Packaging Index teilen möchten, können Sie dies tun, indem Sie das Verfahren „Registrieren“ gemäß den folgenden Schritten einleiten:

python setup.py register

Sie müssen das Verfahren abschließen, indem Sie den Anweisungen auf dem Bildschirm folgen.

Wenn Sie ein registriertes Login haben, um nur hochzuladen, können Sie Folgendes verwenden:

python setup.py sdist upload

Wie man Pakete für die neuen Versionen Ihrer Anwendung erstellt

  1. Bearbeiten Sie die setup.py-Datei mit einem Texteditor (z. B. nano) und setzen Sie die neue Versionsnummer: version="0.1.1"

  2. Bearbeiten Sie die CHANGES.txt, um die Änderungen widerzuspiegeln.

  3. Nehmen Sie die erforderlichen Anpassungen an der LICENSE.txt und README.txt vor.

  4. Laden Sie Ihren Code entsprechend dem vorherigen Schritt hoch.

Eingereicht von: O.S. Tezer