Paketierung und Bereitstellung von Python-Projekten (1): Das Konzept und die Beziehung zwischen Modulen und Paketen

Derzeit beziehen sich verschiedene Python-Tutorials selten auf Python-Paketierungs- und Bereitstellungstechnologien, oder die Beschreibungen sind zu oberflächlich und einseitig. Ich versuche, von den Prinzipien auszugehen, sie mit Beispielen zu kombinieren und Vorschläge zu Standardarbeitsschritten zu machen, um Python-Programmierbegeisterten ein detaillierteres Referenz-Tutorial für die Verpackung und Bereitstellung von Python-Projekten bereitzustellen.

Weitere Kapitel in diesem Tutorial

Obwohl Python eine dynamisch typisierte Programmiersprache ist, muss sie nicht im Voraus kompiliert werden. Ein Python-Projekt besteht jedoch auch aus einer Reihe von .py-Dateien, Datendateien, Ressourcendateien usw. Die meisten Projekte verweisen auch auf Bibliotheken von Drittanbietern, und es gibt auch ein Abhängigkeitsmanagement. Daher ähnelt das Python-Projektmanagement anderen Sprachen wie Java und C++. Beim Erstellen eines Python-Projekts sind Module und Pakete die Grundkonzepte, mit denen wir konfrontiert werden.

1. Die Konzepte von Modulen und Paketen

Ein Modul in Python ist eine separate .py-Datei, die Variablendefinitionen, Funktionsdefinitionen, Klassendefinitionen und andere ausführbare Anweisungen enthält. Ein Modul ist eine unabhängige Codeeinheit, die direkt mit dem Interpreter ausgeführt und in andere Module importiert werden kann.

Ein Paket hingegen ist eine Sammlung von Modulen, die in einem Verzeichnis enthalten sind. Pakete ermöglichen es uns, mehrere verwandte Module unter einem gemeinsamen Namensraum zu gruppieren, was die Organisation und Strukturierung unserer Codebasis erleichtert.

Das Aufteilen Ihres Codes in Module und Pakete kann enorme Vorteile bringen:

  • Wartbarkeit. Durch die Aufteilung des Codes in Module können wir Änderungen an unabhängigen Teilen der gesamten Anwendung vornehmen, ohne die gesamte Anwendung zu beeinträchtigen, da Module nur für die Verarbeitung eines Teils der Anwendung konzipiert sind.
  • Wiederverwendbarkeit. Dies ist ein wichtiger Teil der Softwareentwicklung, bei dem wir den Code nur einmal schreiben und ihn so oft wie nötig in so vielen verschiedenen Teilen der Anwendung verwenden müssen. Dadurch können wir sauberen, prägnanten Code schreiben.
  • Arbeitsteilung und Zusammenarbeit erleichtern. Mit modularem Code können verschiedene Entwickler im Team verschiedene Teile (Module) derselben Anwendung übernehmen, ohne sich gegenseitig zu stören.
  • Lesbarkeit. Durch die Aufteilung des Codes in Module und Pakete wird die Lesbarkeit des Codes verbessert. Es ist leicht, die Funktion verschiedener Codes in der Datei zu erkennen. Beispielsweise könnten wir eine Datei mit dem Namen „databaseConnection.py“ haben: Allein am Namen können wir erkennen, dass diese Datei Datenbankverbindungen verarbeitet.

2. Detaillierte Erläuterung der Module

Module enthalten ausführbare Anweisungen und Funktionsdefinitionen. Diese Anweisungen dienen zur Initialisierung des Moduls und werden nur ausgeführt, wenn eine Importanweisung zum ersten Mal auf den Modulnamen trifft. (Diese Anweisungen werden auch ausgeführt, wenn die Datei als Skript ausgeführt wird.)

Jedes Modul verfügt über einen eigenen privaten Namensraum, der als globaler Namensraum für alle im Modul definierten Funktionen verwendet wird. Daher können Modulautoren globale Variablen innerhalb des Moduls verwenden, ohne sich Gedanken über versehentliche Konflikte mit globalen Benutzervariablen machen zu müssen. Wenn Sie jedoch wissen, was zu tun ist, können Sie über modname.itemname auf die globalen Variablen eines Moduls zugreifen und dabei die gleiche Notation verwenden, die für die Referenzierung von Modulfunktionen verwendet wird.

2.1 Beispiel für die Erstellung eines Moduls

Öffnen Sie Ihre IDE oder Ihren Texteditor, erstellen Sie eine Datei, nennen Sie sie „sample.py“ und geben Sie den folgenden Code ein:

# sample.py

# create a variable in the module
sample_variable  = "This is a string variable in the sample.py module"

# A function in the module
def say_hello(name):
  return f"Hello, {
      
      name}  welcome to this simple module."

# This is another function in the module
def add(a, b):
  return f"{
      
      a} + {
      
      b} is = {
      
      a+b}"

print(sample_variable)
print(say_hello("小明"))
print(add(2, 3))

Der obige Code definiert ein Modul namens „sample.py“. Es enthält eine Variable namens „sample_variable“, deren Wert die Zeichenfolge „Dies ist eine Zeichenfolgenvariable im Modul „sample.py““ ist. Dieses Modul enthält außerdem zwei Funktionsdefinitionen. Beim Aufruf empfängt die Funktion say_hello() einen Namensparameter und wenn wir ihr einen Namen übergeben, gibt sie eine Willkommensnachricht zurück. Die Funktion add() gibt die Summe der beiden ihr übergebenen Zahlen zurück.
Obwohl Module in anderen Teilen des Programms oder der Anwendung verwendet werden, können wir sie unabhängig ausführen. Um dieses Modul auszuführen, müssen wir Python in der Entwicklungsumgebung installieren. Wir können es mit dem folgenden Befehl auf dem Terminal ausführen:

python sample.py 

oder

python3 sameple.py

Operationsergebnis

This is a string variable in the sample.py module
Hello, 小明  welcome to this simple module.
2 + 3 is = 5

Wir können es als unabhängiges Modul ausführen, aber in den meisten Verwendungsszenarien wird ein Modul normalerweise durch Importieren anderer Module oder des Python-Hauptprogramms verwendet. Um also Variablen, Funktionen und Klassen aus einem Modul in einem anderen Modul zu verwenden, müssen wir dieses Modul importieren. Es gibt verschiedene Möglichkeiten, ein Modul zu importieren. Sehen wir uns also an, wie man ein Modul importiert

2.2 Import-Anweisung

Verwenden Sie import module_name, um den Inhalt eines anderen Moduls in dieses Modul zu importieren. Verwenden Sie beispielsweise das Importbeispiel in another_module.py

# another_module.py

import sample

print(sample.sample_variable)
print(sample.say_hello(“John”))
print(sample.add(2, 3))

Der obige Code zeigt, wie Funktionen aus dem Modul „sample.py“ importiert werden, damit sie in „other_module.py“ verwendet werden können. Beachten Sie, dass beim Importieren eines Moduls die Erweiterung .py nicht angegeben werden muss

2.3 Verwenden Sie die from … import …-Anweisung

Sie können das Schlüsselwort from auch verwenden, um bestimmte Funktionen oder Variablen zu importieren. Angenommen, in einem Modul sind viele Funktionen und Variablen definiert, und wir möchten nicht alle verwenden. Mit dem Schlüsselwort from können Sie die zu verwendende Funktion oder Variable angeben:


# another_module.py

from sample import add

print(add(10, 4))

Der obige Code zeigt, dass wir speziell die Funktion add() aus dem Beispielmodul importiert haben.
Ein weiterer Vorteil der Verwendung des Schlüsselworts from besteht darin, dass bei Verwendung einer importierten Funktion keine Notwendigkeit besteht, diese zu benennen oder ihr den Namen des übergeordneten Moduls voranzustellen. Dies führt zu saubererem und besser lesbarem Code.

2.4 Verwenden Sie das Schlüsselwort as

Wir können „as“ verwenden, um einen Alias ​​oder alternativen Namen für ein Modul bereitzustellen.

Manchmal definieren wir Modulnamen, die sehr lang oder unleserlich sind. Python bietet eine Möglichkeit, Aliase für Modulimporte bereitzustellen. Dazu verwenden wir das Schlüsselwort as:

# another_module.py

import sample as sp

result = sp.add(5, 5)
print(result)
print(sp.say_hello("Jason"))

Dieser Code zeigt den Import eines Beispielmoduls, wobei dem Modul ein Alias ​​zugewiesen wird sp. Die Verwendung von sp entspricht genau dem Aufruf von „sample“. Es kann auch auf Variablen und Funktionen zugegriffen werden.

Mit den oben genannten drei Methoden können wir Variablen oder Funktionen eines Moduls in einem anderen Modul verwenden und so die Lesbarkeit der Anwendung verbessern, da wir den Code nicht in einer Datei ablegen müssen.

Bei der Benennung von Modulnamen verwenden Sie am besten Kleinbuchstaben und setzen _zwischen den beiden Wörtern die folgende Zeile. Beispielsweise gibt es ein Modul zur Handhabung von Datenbankverbindungen, Sie können es „database_connection.py“ nennen. Denken Sie außerdem daran, dass bei Namen in Python die Groß-/Kleinschreibung beachtet wird. Stellen Sie daher sicher, dass Sie beim Importieren den richtigen Modulnamen verwenden.

Insgesamt ermöglicht uns die Verwendung von Modulen, Code auf lesbare und wartbare Weise zu erstellen und zu organisieren.

2.5 Modulnamen im Code abrufen

Innerhalb des Moduls kann der Modulname (d. h. String) über die globale Variable name abgerufen werden . Modifizieren Sie das vorherige Beispiel leicht und erhalten Sie den Modulnamen innerhalb des Beispiels und another_module.py.

# another_module.py

import sample

print(sample.sample_variable)
print(sample.say_hello(“John”))
print(sample.add(2, 3))
print(__name__)

Rufen Sie in another_module.py den Modulnamen „sample.py“ ab

# another_module.py

import sample as sp

result = sp.add(5, 5)
print(result)
print(sp.say_hello("Jason"))
print(sp.__name__) 

3. Detaillierte Erklärung zu Paketen

Pakete in Python sind eine Möglichkeit, verwandte Module in Verzeichnissen zu organisieren. Es bietet eine bessere Möglichkeit, Code zu organisieren. Pakete werden normalerweise verwendet, um Module zu gruppieren, die dieselbe Funktion ausführen oder zur selben Komponente gehören.
Pakete stellen hierarchische Beziehungen mit demselben Paket, Modul und derselben Funktion (globale Variable) dar, indem sie den Punkt „.“ verwenden. Beispielsweise gibt der Modulname AB ein Submodul mit dem Namen B in einem Paket mit dem Namen A an.

1) Die Beziehung zwischen Paket, Modul und Dateien

Paket (Paket), Modul (Modul), Datei (Datei) Die Beziehung zwischen den dreien,

  • Das Paket besteht aus Modulen, was dem Namensraum der Module entspricht.
  • Modul, die .py-Codedatei, die den Funktionscode enthält, wird auch als Modul bezeichnet, kann jedoch nicht als config.py , __init__.pyModul bezeichnet werden.
    Fügen Sie hier eine Bildbeschreibung ein

2) Die Beziehung zwischen Paketen und Verzeichnissen

Obwohl ein Paket formal als Verzeichnis verstanden werden kann, sind nicht alle Verzeichnisse, die Code enthalten, Pakete.
Fügen Sie hier eine Bildbeschreibung ein

Der Schlüssel zur Unterscheidung der beiden besteht darin, dass das Paketverzeichnis __init__.pyDateien enthält und diejenigen, die diese Datei nicht enthalten, nicht als Paketverzeichnis bezeichnet werden können .

Das Paket kann ein Unterpaket enthalten, es muss sich jedoch auch in seinem Verzeichnis befinden.__init__.py

Verwenden Sie bei Verwendung Punkte, um hierarchische Beziehungen anzuzeigen

mypkg.mymodule.func_1()

3) Pakete, Module, Funktionen importieren

iGehen Sie davon aus, dass das aktuelle Projekt ein Projekt ist, das Sounddateien und Sounddaten auf einheitliche Weise verarbeitet. Sounddateien gibt es in vielen Formaten (oft durch Erweiterungen gekennzeichnet, zum Beispiel: .wav, .aiff, .au), daher muss eine wachsende Sammlung von Modulen für die Konvertierung zwischen verschiedenen Dateiformaten erstellt und verwaltet werden. Um unterschiedliche Verarbeitungen von Klangdaten umzusetzen (z. B. Klänge mischen, Echo hinzufügen, Equalizer-Funktionen, künstliche Stereoeffekte erzeugen), muss eine endlose Reihe von Modulen programmiert werden. Der folgende hierarchische Dateibaum zeigt die Architektur dieses Pakets:

sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

Wie im vorherigen Abschnitt erwähnt, __init__.pyhandelt es sich bei dem Verzeichnis um ein Paket. Daher ist Sound im obigen Projekt das Hauptverzeichnis des Projekts und stellt auch ein Paket dar. Darunter befinden sich drei Unterpakete: Filter, Effekte und Formate. Unter jedem Unterpaket gibt es mehrere Module.

So importieren Sie Unterpakete.
Absolutes Zitat:

Das Modul sound.filters.vocoder muss das Echo-Modul im Unterpaket sound.effects verwenden, das wie folgt zitiert wird:

from sound.effects import echo

relativer Bezug

from . import echo bedeutet, dass das Echo-Modul unter dem aktuellen Paket importiert wird

from ... Formate importieren bedeutet, das Format-Unterpaket aus dem übergeordneten Verzeichnis zu importieren.

4) Importieren Sie Pakete von Drittanbietern

Pakete von Drittanbietern, also Pakete, die von der Python-Community verifiziert wurden, werden üblicherweise auch als Bibliotheken bezeichnet. Die Importmethoden sind unterteilt in: je nach Quelle:

(1) Importieren Sie das von pip installierte Paket.
Gemäß der PyPi-Methode ist es das von pip installierte Paket eines Drittanbieters. Beim Import sucht der Python-Interpreter unter Lib/site-packages/ im Python-Installationsverzeichnis danach . Wenn es nicht gefunden wird, wird ein Fehler gemeldet.

import numpy
import pandas 

(2) Importieren Sie das Drittanbieterpaket manuell.
Sie müssen den absoluten Pfad des Drittanbieterpakets zur Variablen sys.path hinzufügen. Der Pfad des Drittanbieterpakets pkg_a lautet beispielsweise /usr/local/pkg_a, Beispiele für Import und Verwendung:


import sys
 
# appending a path
sys.path.append('/usr/local/pkg_a')
 
# importing required module
import pkg_a
from pkg_a import module_a
 
# accessing its content
module_a.foo()

4. Modulsuchpfad

Häufig gestellte Fragen : Beim Importieren von Paketen und Modulen in die Test-/Testdatei tritt häufig ein Importfehlerproblem auf. Der Grund dafür ist, dass das Testverzeichnis kein Projektunterpaket ist. Gemäß der Standardimportmethode kann der Modulpfad dies nicht tun gefunden werden.

In der .py-Moduldatei sucht der Interpreter beim Importieren anderer Module, z. B. Spam, zunächst nach dem in Python integrierten Modul. Diese Modulnamen sind in sys.builtin_module_names aufgeführt. Wenn es nicht gefunden wird, sucht es in der durch die Variable sys.path angegebenen Verzeichnisliste nach einer Datei mit dem Namen spam.py.
sys.path wird initialisiert von:

  • Das Verzeichnis, in dem das .py-Skript direkt über die Befehlszeile ausgeführt wird (oder das aktuelle Verzeichnis, wenn keine Datei angegeben ist).
  • PYTHONPATH (Inhalt ist eine Verzeichnisliste).
  • Unterverzeichnis Lib/site-packages im Python-Installationsverzeichnis.
>>> import sys
>>> sys.path
['',
'C:\\opt\\Python36\\python36.zip',
'C:\\opt\\Python36\\DLLs',
'C:\\opt\\Python36\\lib',
'C:\\opt\\Python36',
'C:\\Users\\NanoDano\\AppData\\Roaming\\Python\\Python36\\site-packages',
'C:\\opt\\Python36\\lib\\site-packages',
'C:\\opt\\Python36\\lib\\site-packages\\win32',
'C:\\opt\\Python36\\lib\\site-packages\\win32\\lib',
'C:\\opt\\Python36\\lib\\site-packages\\Pythonwin']

3 Möglichkeiten, sys.path zu ändern:

(1) Anhängen eines Pfades

sys.path.append(``'C:/Users/Vanshi/Desktop'``)

(2) sys.path liest bei der Initialisierung die Python-Systemvariable PYTHONPATH. PYTHONPATH kann im Startskript geändert werden, die Syntax ist dieselbe wie der Pfad der Umgebungsvariablen

set PYTHONPATH=C:\pypath1\;C:\pypath2\
python -c "import sys; print(sys.path)"
# Example output
['', 'C:\\pypath1', 'C:\\pypath2', 'C:\\opt\\Python36\\python36.zip', 'C:\\opt\\Python36\\DLL

Der festgelegte Variablenname = Wert wird vorübergehend hinzugefügt und wird nach dem Schließen des Terminals ungültig.

Um eine änderbare Umgebungsvariable dauerhaft hinzuzufügen,
sollte setx ENV_NAME env_value mit Vorsicht verwendet werden.

wie:

setx -m PATH „%PATH%;C:\Programme (x86)\Microsoft Visual Studio 14.0\VC\bin“

Fügen Sie den Befehl „Umgebungsvariable“ unter Linux hinzu

export PYTHONPATH='/some/extra/path'

(3) Verwenden Sie das Site-Modul, um sys.path zu ändern

Ändern Sie die Variable sys.path im Programmcode so, dass sie beim Systemstart geladen wird und das entsprechende Modul gefunden werden kann.

import site
import sys

site.addsitedir('/the/path')  # Always appends to end
print(sys.path)

Supongo que te gusta

Origin blog.csdn.net/captain5339/article/details/132637042
Recomendado
Clasificación