Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Pakete, Module und Bibliotheken

Import external libraries and organize your code into functional chunks. For interactive reading and executing code blocks Binder and find b05-pypckg.ipynb, or install Python and JupyterLab locally.

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)
<Figure size 640x480 with 1 Axes>

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

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

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

    • icecreamdialogue.py - Dialog mit der Produktion von Python Script

    • icecream_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)

Erfolgsprüfung lernen

Nehmen Sie den Lernerfolgstest für dieses Jupyter Notebook.