Import Module spielen eine wichtige Rolle in Python. Deswegen hat man mehrere Möglichkeiten, Module zu importieren, wobei man ziemlich genau festlegen kann, was man importieren will. Beim Import eines Modules sucht Python nach allen Dateien, die für Python importierbar sind. Diese sucht der Interpreter in der Umgebungsvariable PYTHONPATH, die in sys.path aufgenommen wird und im aktuellen Verzeichnis. Dabei können .py (normaler Quellcode), .pyc (Bytecode), .pyo (optimierter Bytecode), .pyd (DLLs unter Windows) und .so (dynamische Bibliotheken unter Unix-Systemen) importiert werden.

Eine weitere Möglichkeit sind sogenannte Packages, die aus einem Ordner bestehen, der eine Datei namens __init__.py (oder eben auch .pyc oder .pyo) enthält. Diese Pakete kann man auch in der Form import ordnername importieren, wobei die __init__-Datei abgearbeitet wird.

import modul

Dieser Importtyp ist der häufigste; das Modul wird in den aktuellen Namensraum aufgenommen. Danach ist das Modul als modul verwendbar und man kann beispielsweise mit dir(modul) untersuchen, was das Modul so bereitstellt.

import modul as name

Diese Importart funktioniert praktisch genauso wie die vorherige, jedoch wird das Modul danach nicht mehr unter dem Namen modul ansprechbar sein, sondern als name. Damit wird also das Modul umbenannt. Das eignet sich besonders, wenn man sich Schreibarbeit ersparen kann, wie beispielsweise mit Tkinter möglich: import Tkinter as tk.

   1 import Tkinter as tk
   2 root = tk.Tk()
   3 can = tk.Canvas(root, width="3c", height="4c")
   4 can.pack()
   5 tk.mainloop()

from modul import name

Bei diesem Aufruf wird aus dem Modul modul name importiert. Danach ist es als name zugreifbar. Auch komplexere Aufrufe mit umbenennen sind möglich, wie from math import sqrt as quadratwurzel. Dadurch ist die Funktion sqrt() aus dem math-Modul nun als quadratwurzel() bekannt. Dabei muss name auch nicht unbedingt eine Funktion sein, es kann auch eine Variable, eine Klasse oder auch eine Instanz sein, das ist völlig egal.

from modul import *

Die letzte Option ist ein Stern-Import. Der Stern dient als Platzhalter und signalisiert, dass "alles" aus dem betreffenden Modul importiert werden soll. Dies mag zwar bequem erscheinen, so dass man nicht mehr den Modulnamen vor der Funktion schreiben muss, hat aber den Nachteil, dass bestehende Objekte (Funktionen, Klassen etc.) unbemerkt überschrieben werden können.

Es passiert oft, dass jemand PIL importiert mit import Image und danach noch Tkinter durch ein from Tkinter import * einbindet. Dabei wird aber Image (aus PIL) durch das Image aus Tkinter überschrieben, was sehr oft zu schwer zu verstehenden Fehlern führt. Eine saubere Lösung ist es, Module generell nie mit Stern einzubinden, außer man weiß genau was man tut. So kann man Tkinter auch einfach über import Tkinter as tk importieren, sodass man danach auf tk.Image, tk.Frame usw. zugreift. Sowohl PyGTK als auch wxPython nutzen schon seit längerem Namensräume (import gtk und passenderweise gtk.Window bzw. import wx und wx.App).

Stern-Importe sind in Python meist nur dafür gedacht, in der interaktiven Python-Shell benutzt zu werden, da man sich dort gerne etwas Tipparbeit erspart.

Anwendungen

Hier noch einige Zusatzinformationen rund um das Importieren.

Mehrfachimporte

Manchmal möchte man ein Modul noch einmal laden, nachdem man es durch ein import modul schon importiert hat, besonders häufig in der interaktiven Shell, wenn man das Modul zwischendurch im Editor verändert hat. Zu diesem Zweck dient die Funktion reload().

Importfehler abfangen

Wenn man ein Modul nur laden will, falls es auf dem Zielsystem installiert ist, bzw. eine Fehlermeldung ausgegeben will, falls das Modul nicht importiert werden kann, muss man die ImportError-Ausnahme abfangen. Ist das zu importierende Modul optional, d.h. das Programm kommt auch ohne das Modul aus oder hat eine alternative Implementierung, kann man z.B. folgendes Vorgehen benutzen:

   1 try:
   2     import somemodule
   3     has_somemodule = True
   4 except ImportError:
   5     import warnings
   6     warnings.warn("Module 'somemodule' konnte nicht importiert werden!")
   7     has_somemodule = False
   8 
   9 # später irgendwo ...
  10 if has_somemodule:
  11     somemodule.somefunc(...)
  12 else:
  13     alternative_func(...)

Module dynamisch laden

Per __import__, Import Hooks und dem Modul imp.

Information zu __import__ gibt es in der Python-Dokumentation.

Ausführung als Skript

Wenn ein Modul importiert wird, wird es ausgeführt. Code, der nicht in einer Funktion oder Klasse steht, wird also direkt abgearbeitet. Dies ist oftmals unpraktisch, deswegen gibt es einen kleinen Trick, wie man Code ausführt, wenn das Skript direkt gestartet wird, aber nicht wenn das Modul importiert wird.

   1 if __name__ == '__main__':
   2     main()

An und für sich ist es in Python kein Problem, wenn sich zwei Module gegenseitig importieren. (Also Modul A importiert Modul B, und Modul B importiert wiederum Modul A). Das kann auch in vielen Situationen durchaus nützlich sein. Man muss dabei bloß beachten, dass die Module sich gegenseitig ausführen, jedes Mal, wenn eine import-Anweisung geparst wird. (Meistens bricht der Interpreter dann wegen fehlender Definitionen ab.)

Es ist also grundsätzlich eine schlaue Idee, im "Hauptmodul" ein Konstrukt zu verwenden, das dafür sorgt, dass der kritische Code nur einmal ausgeführt wird:

   1 import modulB
   2 
   3 if __name__ == "__main__":
   4   # Code, der modulB verwendet

Plugin-System

Ein Plugin-System gibt es nicht out-of-the-box, läßt sich aber recht einfach realisieren:

Weiterhin gibt es das entry point-System des Moduls setuptools, das Funktionen für das Finden und Laden von Plugins bietet und durch das Plugins als Python Eggs verteilt und installiert werden können.

Beispiel

Angenommen, es gibt folgende Dateien:

In meine_klasse.py gibt es eine Funktion, die meine_funktion() heißt. Der Import in index.py und der Aufruf der Funktion geht dann so:

   1 import classes.meine_klasse
   2 classes.meine_klasse.meine_funktion()

Alternativ kann man auch nur bestimmte Namen importieren:

   1 from classes import meine_klasse
   2 meine_klasse.meine_funktion()

oder nur bestimmte Funktionen

   1 from classes.meine_klasse import meine_funktion
   2 meine_funktion()

Das ganze geht nur, wenn im Verzeichnis classes/ eine Datei namens __init__.py ist. Diese Datei kann auch einfach leer sein. Wichtig ist nur, dass sie da ist.

Weiterführende Dokumentation

Tags: Codesnippets | Artikel | Grundlagen | Umsteiger

Import (zuletzt geändert am 2012-07-10 11:25:59 durch anonym)