Import external libraries and organize your code into functional chunks. For interactive reading and executing code blocks and find b05-pypckg.ipynb, or install Python and JupyterLab locally.
Watch this section as a video
Watch this section as a video on the @Hydro-Morphodynamics channel on YouTube.
Pakete oder Module importieren¶
Das Importieren eines Pakets oder Moduls in Python macht externe Funktionen und andere Elemente (wie Objekte) von Modulen in einem Skript zugänglich. Die Funktionen und andere Elemente werden in einer anderen Python-Datei (.py) in einigen /site packages/-Ordner (Regie) der Dolmetscherumgebungen gespeichert. Um ein nicht standardmäßiges Paket zu verwenden, muss es zunächst heruntergeladen und installiert werden. Standard-Python-Pakete (z.B. os, math) sind immer zugänglich, und andere können mit conda oder pip (read more pip-installing) hinzugefügt werden.
Das os-Paket bietet grundlegende system-terminal-ähnliche Befehle zum Beispiel zur Verwaltung von Ordnerverzeichnissen. Also lasst uns dieses wesentliche Paket importieren:
import os
print(os.getcwd()) # print current working directory
print(os.path.abspath('')) # print directory of script running/home/schwindt/github/hyhome-v2/jupyter
/home/schwindt/github/hyhome-v2/jupyter
Übersicht der Importoptionen¶
Hier eine Übersicht über die Optionen zum Import von Paketen oder Modulen (hierarchische Teile von Paketen):
| Befehl | Beschreibung | Verwendung von Attributen |¶
| import package-name | Importieren Sie ein Original-Modul | package.item() |
| import package-name as nick-name | Import Modul und Umbenennen (alias) es im Skript |nick-name.item() |
| from package-name import item | Importieren Sie nur eine Funktion, Klasse oder andere Elemente |item() |
| from package-name import * | Alle Artikel eintragen | item() |
Beispiel¶
import matplotlib.pyplot as plt # import pyplot from the matplotlib module and alias it with plt
import math as m
x = []
y = []
for e in range(1, 10):
x.append(e)
y.append(e**2)
plt.plot(x, y)
Was ist der beste Weg, um ein Paket oder Modul zu importieren?¶
Es gibt keine globale Antwort auf diese Frage. Beachten Sie jedoch, dass from package-name import * alle vorhandenen Variablen oder andere Elemente im Skript überschreibt. Verwenden Sie daher nur *, wenn Sie sich alle Inhalte eines Moduls oder Pakets bewusst sind.
pi = 9.112 # define a float called pi
print("Pi is not %1.3f." % pi)
from math import pi # this overwrites the before defined variable pi
print("Pi is %1.3f." % pi)Pi is not 9.112.
Pi is 3.142.
Welche Artikel (Beiträge, Klassen, Funktionen) sind in einem Modul?¶
Manchmal wollen wir Module erkunden oder variable Attribute überprüfen. Dies wird mit dem Befehl dir() erreicht:
import sys
print(sys.path)
print(dir(sys.path))
a_string = "zabaglione"
print(", ".join(dir(a_string)))['/home/schwindt/miniforge3/envs/wrr-proj/lib/python311.zip', '/home/schwindt/miniforge3/envs/wrr-proj/lib/python3.11', '/home/schwindt/miniforge3/envs/wrr-proj/lib/python3.11/lib-dynload', '', '/home/schwindt/miniforge3/envs/wrr-proj/lib/python3.11/site-packages']
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
__add__, __class__, __contains__, __delattr__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __getnewargs__, __getstate__, __gt__, __hash__, __init__, __init_subclass__, __iter__, __le__, __len__, __lt__, __mod__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __rmod__, __rmul__, __setattr__, __sizeof__, __str__, __subclasshook__, capitalize, casefold, center, count, encode, endswith, expandtabs, find, format, format_map, index, isalnum, isalpha, isascii, isdecimal, isdigit, isidentifier, islower, isnumeric, isprintable, isspace, istitle, isupper, join, ljust, lower, lstrip, maketrans, partition, removeprefix, removesuffix, replace, rfind, rindex, rjust, rpartition, rsplit, rstrip, split, splitlines, startswith, strip, swapcase, title, translate, upper, zfill
Neues Modul erstellen¶
Bei der objektorientierten Programmierung und Code Factorisierung ist das Schreiben von benutzerdefinierten, neuen Modulen eine wesentliche Aufgabe. Um ein neues Modul zu schreiben, erstellen Sie zunächst ein neues Skript. Dann öffnen Sie das neue Skript und fügen Sie einige Parameter und Funktionen hinzu.
# icecreamdialogue.py
flavors = ["vanilla", "chocolate", "bread"]
price_scoops = {1: "two euros", 2: "three euros", 3: "your health"}
welcome_msg = "Hi, I only have " + flavors[0] + ". How many scoops do you want?"icecreamdialogue.py can now either be executed as a script (nothing will happen visibly) or imported as a module to access its variables (e.g., icecreamdialogue.flavors):
import icecreamdialogue as icd
print(icd.welcome_msg)
scoops_wanted = 2
print("That makes {0} please".format(icd.price_scoops[scoops_wanted]))Machen Sie Skript Stand-alone¶
As an alternative, we can append the call to items in icecreamdialogue.py in the script and run it as a stand-alone script by adding an if __name__ == "__main__": block:
# icecreamdialogue_standalone.py
flavors = ["vanilla", "chocolate", "bread"]
price_scoops = {1: "two euros", 2: "three euros", 3: "your health"}
welcome_msg = "Hi, I only have " + flavors[0] + ". How many scoops do you want?"
if __name__ == "__main__":
print(welcome_msg)
scoops_wanted = 2
print("That makes {0} please".format(price_scoops[scoops_wanted]))Hi, I only have vanilla. How many scoops do you want?
That makes three euros please
Now we can run icecreamdialogue_standalone.py in a terminal (e.g., Linux Terminal, PyCharm’s Terminal tab at the bottom of the window, or VS Code’s integrated terminal).
C:\temp\ python icecreamdialogue_standalone.pyStandalone Scripts mit Eingabeparametern¶
Um das Skript flexibler zu gestalten, können wir beispielsweise scoops_wanted als Eingangsgröße einer Funktion definieren.
# icecreamdialogue_standalone_withinput.py
flavors = ["vanilla", "chocolate", "bread"]
price_scoops = {1: "two euros", 2: "three euros", 3: "your health"}
welcome_msg = "Hi, I only have " + flavors[0] + ". How many scoops do you want?"
def dialogue(scoops_wanted): #formerly in the __main__ statement
print(welcome_msg)
print("That makes {0} please".format(price_scoops[scoops_wanted]))
if __name__ == "__main__":
# import the terminal function emulator sys
import sys
if len(sys.argv) > 1: # make sure input is provided
# if true: call the dialogue function with the input argument
dialogue(int(sys.argv[1]))Jetzt können wir icecreamdialogue_standalone_withinput.py in einem Terminal ausführen.
C:\temp\ python3 icecreamdialogue_standalone.py 2Initialisierung eines Pakets (Hierarchisch organisiertes Modul)¶
Gute Praxis beinhaltet, dass ein Skript 50-100 Zeilen Code nicht überschreitet (außer Inline-Docs und Multiline-Variablen). Folglich wird ein Paket höchstwahrscheinlich aus mehreren Skripten bestehen, die in einem Ordner gespeichert werden und ein Kernskript dient zur Initiierung der Skripte. Dieses Kernskript heißt __init__.py und Python ruft diesen Skriptnamen immer in einem Paketordner an. Beispielstruktur eines Moduls namens icecreamery:
icecreamery__init__.py- Paketeinleitung Python Scripticecreamdialogue.py- Dialog mit der Produktion von Python Scripticecream_maker.py- virtuelles Eis erzeugen Python Script
Um die beiden relevanten Skripte (Submodule) des icecreamery-Moduls automatisch einzugeben, muss die __init__.py folgendes enthalten:
# __init__.py
print(f'Invoking __init__.py for {__name__}') # not absolutely needed ..
import icecreamery.icecreamdialogue, icecreamery.icecream_maker# example usage of the icecreamery package
import icecreamery
print(icecreamery.icecreamdialogue.welcome_msg)Erinnern Sie sich an die dir() Funktion? Es ist beabsichtigt, alle Module in einem Paket auflisten, aber es tut nicht, es sei denn, wir haben eine __all__-Liste in der __init__.py festgelegt.
# __init__.py with __all__ list
__all__ = ['icecreamdialogue', 'icecream_maker']Das komplette Beispiel des icecreamery_all Pakets ist auch in einem icecream Repository erhältlich.
# example usage of the icecreamery package
from icecreamery_all import *
print(icecreamdialogue.welcome_msg)Zusammenfassung der Paketerstellung¶
Ein hierarchisch organisiertes Paket enthält eine __init__.py-Datei mit einer __all__-Liste, um relevante Modulskripte anzurufen. Die Struktur eines Moduls kann komplexer sein als die obige Beispielliste (z.B. mit Unterordner). Wenn Sie ein Paket schreiben, beachten Sie die Verwendung von meaningful script and variable names, zusammen mit einer entsprechenden Dokumentation.
Reload (Re-Import) eines Pakets oder Moduls¶
Seit Python3 erfordert das Nachladen eines Moduls zunächst den Import des importlib Moduls. Das Nachladen ist nur sinnvoll, wenn Sie ein neues Modul aktiv schreiben. Um jeden Modultyp neu zu laden:
import importlib
importlib.reload(my_module)