Entwicklungshelfer

Hilfen für das Programmieren mit Python

Sind Sie nach den den ersten vier Teilen des Python-Kurses auf den Geschmack gekommen und planen nun größere Projekte mit Python, dann bieten sich einige Helfer an: Dieser Artikel liefert Tipps zu hilfreicher Software für die Entwicklung.

Entwicklungsumgebungen

Bei maschinennahen Sprachen oder solchen mit einer komplexeren Struktur sind sie gang und gäbe, Python-Programmierer setzen sie dagegen seltener ein: die sogenannte IDE. Python-Code brauchen Sie nicht zu übersetzen. Ein Debugger kommt nur sehr selten zum Einsatz; oft reicht ein Traceback, um einen Fehler zu finden. Manchmal helfen ein paar print-Anweisungen.

Meist reicht daher der Lieblingseditor (beispielsweise Vim oder Emacs), zusammen mit einer Shell (Xterm, Konsole, Gnome Terminal), in der Sie einen interaktiven Interpreter oder das zu entwickelnde Programm aufrufen. Abbildung 1 zeigt als Beispiel links eine Shell mit einem Interpreter, rechts den Vim-Editor [1]. Selbst bei diesem minimalistischen Arbeitsstil hilft eine IDE gelegentlich, beispielsweise um Vererbungshierarchien im Code grafisch darzustellen.

Abbildung 1: Eine Shell und den Lieblingseditor – mehr braucht es nicht zum Entwickeln mit Python.

Ungeachtet dessen, dass eine IDE nicht unbedingt nötig ist, gibt es auch für Python etliche [2]. Ein guter Start, vor allem für Gelegenheitsprogrammierer, ist das Programm Idle (Abbildung 2), das bei den meisten Linux-Distributionen zusammen mit der Python-Standarddistribution installierbar ist, und das Sie durch Eingabe von idle & auf der Kommandozeile starten.

Abbildung 2: Die Programmierumgebung Idle liefern die meisten Distributionen im Standardumfang mit.

Eine Auswahl weiterer IDEs aus dem Open-Source- und dem kommerziellen Umfeld listet die Tabelle "Python-IDEs" auf. Es empfiehlt sich, eine IDE zu verwenden, deren Feature-Liste die Unterstützung für die Skriptsprache nicht nur nebenbei listet. Solche IDEs konzentrieren sich häufig auf C und C++ und bieten beispielweise keine Debugger-Integration für Python. Mitunter erschöpft sich der Support dann darin, dass der integrierte Editor den Quellcode richtig einfärbt. Mit den Programmen in der Tabelle liegen Sie dagegen genau richtig.

Python-IDEs

Open Source

Name

URL

Bemerkungen

Boa Constructor http://boa-constructor.sourceforge.net GUI-Designer für wxPython; erzeugt UML-Klassendiagramme
DrPython http://drpython.sourceforge.net mit eigenen Python-Plugins erweiterbar
PyDev http://pydev.sourceforge.net Python-Erweiterung für Eclipse [3]
Eric http://www.die-offenbachs.de/detlev/eric.html für Python und Ruby; viele Features
Stani's Python Editor (SPE) http://www.stani.be/python/spe viele Features; erzeugt UML-Klassendiagramme; GUI-Designer für wxPython
UliPad http://wiki.woodpecker.org.cn/moin/UliPad durch Plugins erweiterbar

Kommerziell

Name

URL

Bemerkungen

BlackAdder http://www.thekompany.com/products/blackadder für Python und Ruby; kostenlose Personal-Edition
Komodo http://www.activestate.com/Products/Komodo spezialisiert auf dynamische Sprachen
WingIDE http://www.wingware.com/products 10 Tage kostenloser Probebetrieb bei vollem Funktionsumfang

Helferlein

Entwickler schätzen den interaktiven Modus des Python-Interpreters. Noch komfortabler geht es mit IPython [4]. Der Screenshot in Abbildung 3 zeigt eine Beispielsitzung. Zu den Vorzügen gehören unter anderem der Zugriff auf viele frühere Ein- und Ausgaben, nicht nur die letzte Ausgabe, wie im gewöhnlichen Python-Interpreter, das Anzeigen oder Vervollständigen von Attributen mit der Tabulator-Taste (Tab Completion) sowie das Anzeigen der Dokumentation oder des Quellcodes eines Objekts durch angehängte Fragezeichen. Außerdem liefert IPython farbige Tracebacks mit mehr Kontext-Zeilen.

Abbildung 3: Der verbesserte Interpreter IPython erlaubt den Abruf alter Ein- und Ausgaben, das Vervollständingen per Tab sowie Docstring- und Traceback-Anzeige.

In Python-Programme schleichen sich, verglichen zum Beispiel mit der maschinennahen Sprache C, sehr selten komplexere Fehler ein. Die meisten Fehler finden Sie durch Tracebacks oder print-Anweisungen relativ schnell. Um aber von vornherein möglichst wenige Programm- und Stilfehler einzubauen, bieten sich die Fehlersuchprogramme PyChecker [5] oder PyLint [6] an, die analog zu Lint für C-Code funktionieren.

Diese finden bereits einige Macken im Code, wie zum Beispiel fehlende Modul-Importe, das Verwenden nicht-existierender Klassenmethoden oder -attribute, den Einsatz einer Variablen vor dem deklarieren sowie unbenutzte Funktions- oder Methoden-Argumente.

Da Python sehr dynamisch ist, müssen einige der obigen Bedingungen nicht zwangsläufig Fehler sein (zum Beispiel dürfen Sie Klassen zur Laufzeit neue Methoden hinzufügen). Das Programm erlaubt es daher, Tests selektiv abzuschalten, um keine unnötigen Warnungen zu bekommen.

Das Entwickeln regulärer Ausdrücke, wie dem Folgenden, ist mitunter langwierig und fehleranfällig:

<C>\bLinux(?:[ -]|)(?P<zeitschrift>User|Magazin)\b<C>

Um es sich einfacher zu machen, benutzen Sie das Paket retest[7], das die Syntax regulärer Ausdrücke von Pythons Modul re versteht (Abbildung 4).

Abbildung 4: Das Paket retest hilft, verschiedene Schreibweisen für den Begriff "LinuxUser" zu berücksichtigen (Textfelder von oben nach unten: zu testender regulärer Ausdruck, zu testender Text, Ergebnisse der Operation).

Im Internet

Natürlich gibt es jede Menge Websites zu Python. Sofern Sie hinreichend gut die englische Sprache beherrschen, ist die Python-Homepage [8] eine zentrale Anlaufstelle. Zahlreiche Python-Module finden Sie über den Python Package Index (PyPI, [9]). Viele Projekte tragen trotz eigener Projekt- und Downloadseiten ihre Paketdaten im Package Index ein. Suchen Sie nicht fertige Module, sondern kleine Rezepte, hilft das Python Cookbook [10] weiter.

In der freundlichen (englischsprachigen) Python-Newsgroup [11] lässt sich trefflich diskutieren. Die Mitglieder beantworten Fragen zwar in der Regel gerne; Sie sollten vor dem Absenden die relevanten Python-FAQs [12] lesen. Manche Antworten auf häufigen Fragen stehen auch im Python-Wiki [13].

Deutschsprachige Python-Seiten sind gegenüber den englischsprachigen leider rar, aber einige gibt es doch, zum Beispiel das deutsche Python-Wiki [14]. Besonders interessant sind hier die Links auf der Startseite unter der Überschrift Informationen.

Gleich drei verschiedene Medien bieten deuschsprachige Hilfe beim Arbeiten mit Python: das Python-Webforum [15], die Newsgroup [16] und die Mailingliste [17]. Das Webforum ist gut strukturiert und umfangreich. Newsgroup und Mailingliste sind in ihrer Verwendung (zu) ähnlich, so dass sich die potenziellen Helfer leider auf zwei Kanäle verteilen (wobei es natürlich auch Leute gibt, die auf beiden aktiv sind).

Pythonmania [18] ist ein gutes deutschsprachiges Blog. Leser, die Schwierigkeiten mit der englischen Sprache haben, schreckt die Seite aber vermutlich ab, da fast alle Links auf englischsprachige Seiten verweisen.

Startklar

Wenn Python für Sie relativ neu ist, werden Sie sich bei manchen Anwendungen fragen, welche der vielen Module und Pakete für Sie sinnvoll sind. Der Rest des Artikels gibt daher Vorschläge für bestimmte Anwendungsgebiete. Die empfohlenen Pakete sind nicht immer die mächtigsten und vielseitigsten ihrer Klasse. Falls Sie aber zunächst keine umfangreichen Systeme entwickeln wollen, können Sie mit der beschriebenen Software schnell loslegen, anstatt sich lange einzuarbeiten.

Die Empfehlungen sind in der Tabelle "Module und Pakete zum Durchstarten" zusammengefasst. URLs, die mit "http://docs.python.org/" beginnen, zeigen an, dass die Software in der Python-Standarddistribution enthalten ist und nicht extra installiert werden muss.

Module und Pakete zum Durchstarten

Anwendung

Software

URL

3D-Grafik Visual Python http://www.vpython.org
Bildverarbeitung PIL http://www.pythonware.com/products/pil
CSV-Dateien verarbeiten csv http://docs.python.org/lib/module-csv.html
Dateioperationen os http://docs.python.org/lib/module-os.html
Dateioperationen shutil http://docs.python.org/lib/module-shutil.html
Datenbank dbhash http://docs.python.org/lib/module-dbhash.html
Datenbank PySQLite http://initd.org/tracker/pysqlite
Datums-/Zeitfunktionen mxDateTime http://www.egenix.com/files/python/mxDateTime.html
Diagramme Matplotlib http://matplotlib.sourceforge.net
E-Mails versenden smtplib http://docs.python.org/lib/module-smtplib.html
E-Mails zusammenbauen/parsen email http://docs.python.org/lib/module-email.html
GUI Tkinter http://docs.python.org/lib/module-Tkinter.html
Kommandozeilen parsen optparse http://docs.python.org/lib/module-optparse.html
Konfigurationsdateien ConfigParser http://docs.python.org/lib/module-ConfigParser.html
Logging logging http://docs.python.org/lib/module-logging.html
Parser (allgemein) pyparsing http://pyparsing.wikispaces.com
Templates string.Template http://docs.python.org/lib/node40.html
Templates Cheetah.Template http://www.cheetahtemplate.org
Unittests doctest http://docs.python.org/lib/module-doctest.html
Webseiten holen urllib http://docs.python.org/lib/module-urllib.html
Webseiten ausliefern CherryPy http://www.cherrypy.org
XML ElementTree http://docs.python.org/lib/module-xml.etree.ElementTree.html
XML lxml http://codespeak.net/lxml

Dreidimensionale bewegte Grafiken erzeugen Sie mit Visual Python (VPython). Der Code in Listing 1 bewirkt, dass eine Kugel um einen Zylinder kreist (Abbildung 5).

Listing 1
import math
import time
import visual as vis
scene = vis.display(width=500, height=500)
scene.center = (0, 2.5, 0)
distance = 2
rod = vis.cylinder(pos=(0, 0, 0), axis=(0, 5, 0), radius=0.5,
                   color=vis.color.blue)
sphere = vis.sphere(pos=(distance, 2.5, 0), radius=1,
                    color=vis.color.red)
scene.autoscale = False
while True:
    for step in range(0, 360):
        phi = step * 2*math.pi/360.
        sphere.x = distance * math.cos(phi)
        sphere.z = distance * math.sin(phi)
        time.sleep(0.02)

Abbildung 5: Momentaufnahme der durch Listing 1 erzeugten Animation.

Die Python Image Library (PIL) eignet sich gut, um Grafikdateien zu bearbeiten. Um den durch Listing 1 erzeugten Screenshot doppelt so breit und hoch zu machen, reicht folgender Code:

import Image
img = Image.open("vpython.png")
width, height = img.size
img2 = img.resize((2*width,
                   2*height))
img2.save("vpython.png", "PNG")

Das mit Python gelieferte Modul csv liest CSV-Dateien (comma-separated values) und extrhiert daraus die Daten. Das Modul os enthält Funktionen, die auf eine einzelne Datei wirken, beispielsweise zum Umbenennen. Mit shutil kopieren oder löschen Sie rekursiv ganze Verzeichnisbäume.

Falls es für Ihre Anwendung reicht, Schlüssel/Wert-Paare ähnlich wie in Dictionaries zu speichern, wobei Schlüssel und Werte jeweils Zeichenketten sind, nehmen Sie das Modul dbhash. Wollen Sie dagegen Datentabellen mit SQL manipulieren, werfen Sie einen Blick auf SQLite und das zugehörige Paket pysqlite.

Das Schnittstellenmodul, nicht jedoch die Datenbank-Bibliothek SQLite, sind in Python 2.5 bereits enthalten. Um SQLite zu nutzen, benötigen Sie keinen Datenbankserver; SQLite speichert alle Tabellen in einer Datei ab. Diese Einfachheit hat allerdings einen Preis: Die Software erlaubt es nicht, dass Programme gleichzeitig auf dieselbe Datenbank zugreifen.

Zwar bringt Python in der Standardinstallation die Module time und datetime mit, diese sind jedoch mitunter recht umständlich zu verwenden. Das Modul mxDateTime ist zwar umfangreicher, aber sehr konsistent aufgebaut und dadurch letztlich einfacher zu benutzen.

Zweidimensionale Diagramme erstellen Sie leicht mit matplotlib, ein Bibliothek zum Zeichnen mathematischer Diagramme. Der folgende Code führt zum Graphen in Abbildung 6.

from pylab import *
t = arange(0.0, 2.0, 0.01)
s = sin(2*pi*t)
plot(t, s, linewidth=1.0)
xlabel('time (s)')
ylabel('voltage (mV)')
title('About as simple as it gets, folks')
grid(True)
show()

Abbildung 6: Ein mit matplotlib erzeugtes Diagramm.

E-Mails verschicken Sie mit dem Modul smtplib:

import smtplib
text = """\
From: info@sschwarzer.net
To: info@sschwarzer.com
Subject: Test
Was fuer ein netter Test.
"""
host = smtplib.SMTP("localhost")
host.sendmail("info@sschwarzer.net", ["info@sschwarzer.com"], text)
host.quit()

Das setzt natürlich voraus, dass der verwendete Mailserver Mails von Ihnen beziehungsweise Ihrem Rechner annimmt. Das obige Beispiel enthält einen sehr einfachen rohen Mailtext einschließlich Kopfzeilen. In der Realität ist dagegen Etliches zu beachten, um saubere Maildaten zu erzeugen. Dabei hilft Ihnen das Paket email, mit dem Sie sogar relativ leicht E-Mails mit Anhängen versehen.

Für Python gibt es Schnittstellen für etliche GUI-Bibliotheken wie GTK, Qt und wxWindows. Für die ersten Schritte eignet sich jedoch Tkinter besonders gut, weil die meisten Distributionen es von Haus aus mitbrigen, und einfache GUI-Schnittstellen leicht zu erstellen sind. Die mit Python installierte IDE Idle ist ebenfalls mit Tkinter programmiert. Der folgende Code grüßt den Anwender und erlaubt ihm, das Programm zu beenden:

import sys
import Tkinter as tk
tk.Label(text="Hallo!").pack()
tk.Button(text="Raus hier",
  command=sys.exit).pack()
tk.mainloop()

Viele Kommandozeilenprogramme werten übergebene Parameter aus. Dabei hilft das mit Python mitgelieferte Modul optparse, das die Optionen und Argumente als Datenstruktur bereitstellt. Es verarbeitet sowohl Optionen, die nur aus einem Zeichen bestehen (auch in kombinierter Form wie in ls -ltr), als auch lange Optionen, die mit -- beginnen.

Wollen Sie Einstellungen nicht von der Kommandozeile übernehmen, sondern aus Konfigurationsdateien, empfiehlt sich Modul ConfigParser, das Dateien im Ini-Stil von Windows liest und auswertet.

Sie möchten, das Ihr Programm Informationen in Log-Dateien schreibt? Dabei hilft das Paket logging. Die Dokumentation des Moduls aus der Standard-Bibliothek erschlägt einen zwar auf den ersten Blick, für einfache Fälle reichen aufgrund sinnvoller Vorgabewerte jedoch schon wenige Zeilen Code (siehe Beispiele in der Dokumentation).

Falls Sie nicht nur einfache Konfigurationsdateien auswerten wollen, sondern kompliziertere Dateiformate analysieren wollen, schauen Sie sich das Modul pyparsing an. Es bietet eine sehr flexible und dennoch übersichtliche Art, Textformate zu definieren.

Einfache Templates (Textvorlagen) füllen Sie mit der Klasse Template im Modul string aus. Wollen Sie aber nicht nur Zeichenketten einsetzen, sondern brauchen in den Templates selbst Fallunterscheidungen und Schleifen, greifen Sie zu Cheetah.Template, mit dem Sie auch aufwendige Frameworks erzeugen.

Zwar ist es mit Python leichter als mit vielen anderen Sprachen, schnell funktionierende Programme zu schreiben, ums Testen kommen Sie aber auch hier nicht herum. Um Tests ohne "manuelle" Vergleiche von Eingaben und Ergebnissen auszuführen, benutzen Sie das mit Python gelieferte doctest-Modul. Dieses führt in Docstrings eingebetteten Python-Code aus und vergleicht die tatsächlichen mit den erwarteten Ergebnissen. Das Listing 2 zeigt ein simples Beispiel.

Listing 2
import doctest
def addiere_eins(n):
    """
    Gib das Argument, erhoeht um Eins, zurueck.
    >>> addiere_eins(3)
    4
    """
    return n + 1
if __name__ == '__main__':
    doctest.testmod()

Führen Sie das Modul auf der Kommandozeile aus:

$ python addiere_eins.py -v
Trying:
    addiere_eins(3)
Expecting:
    4
ok
1 items had no tests:
    __main__
1 items passed all tests:
   1 tests in __main__.addiere_eins
1 tests in 2 items.
1 passed and 0 failed.
Test passed.

Verzichten Sie die Option -v weg, bekommen Sie nur bei Fehlern etwas angezeigt.

Webseiten laden Sie sehr einfach mit dem Modul urllib herunterladen:

>>> import urllib
>>> f = urllib.urlopen("http://www.python.org")
>>> html = f.read()
>>> f.close()
>>> html[:20]
'<!DOCTYPE html PUBLI'

Einen leichten Start mit Webanwendungen ermöglicht CherryPy. Das Listing 3 zeigt die Implementation einer kleinen Website. Speichern Sie den Code in der Datei simple_server.py und rufen Sie diese in einer Shell mit python simple_server.py auf. Geben Sie in einem Webbrowser als Adresse http://localhost:8080 ein und testen Sie das Formular. Wenn Sie http://localhost:8080/hallo ohne Umweg über das Formular aufrufen, gibt es den Vorgabewert Welt zurück.

Listing 3
import cherrypy
template = """\
<html><head><title>Hallo</title></head>
<body bgcolor="#eeddff">%s</body>"""
class Hallo(object):
    @cherrypy.expose
    def halloformular(self):
        return template % """
               <form action="hallo">
               Ihr Name: <input type="text" name="name" />
               <input type="submit" value="Sag Hallo" />
               </form>"""
    @cherrypy.expose
    def hallo(self, name="Welt"):
        return template % ("Hallo %s!" % name)
    index = halloformular
cherrypy.config.update({'global': {'logDebugInfoFilter.on': False}})
cherrypy.root = Hallo()
cherrypy.server.start()

Die Bibliotheken ElementTree und lxml parsen und bearbeiten XML-Daten. Beide Pakete bieten ähnliche Schnittstellen, jedoch ist lxml leistungsfähiger. ElementTree hat wiederum den Vorteil, dass es ab Python 2.5 bereits in der Python-Distribution enthalten ist. Listing 4 zeigt den Bau eines einfachen XHTML-Dokuments mit ElementTree (die Import-Anweisung ist für Python 2.5 angepasst).

Fazit

Python zeigt sich als flexibles Werkzeug für eine Vielzahl von Einsatzmöglichkeiten. Alleine die Standarddistribution, die Sie auf vielen aktuellen Systemen vorfinden, bringt schon die Module für die wichtigsten Aufgaben mit. Haben Sie sich mit dem objektorientierten Programmieren einmal vertraut gemacht, erschließt sich die Funktionsweise der Pakete von Drittanbietern relativ leicht.

Die natürlich Struktur, die Python-Code durch die Einrückungen erhält, erleichtert den Zugang zum Quelltext. Gleichzeitig gewährt die Sprache aber viele Freiheiten beim Programmieren. Nicht ohne Grund wechseln viele Projekte vom altgedienten Perl auf Python. Vielleicht hat dieser kleine Workshop auch Sie animiert, es einmal mit der Skriptsprache zu versuchen.

Listing 4
import sys
import xml.etree.ElementTree as et
root = et.Element("html")
tree = et.ElementTree(root)
head = et.SubElement(root, "head")
title = et.SubElement(head, "title")
body = et.SubElement(root, "body")
body.set("bgcolor", "#eeddff")
title.text = "Beispiel-Titel"
body.text = "Hallo Welt!"
tree.write(sys.stdout)
print

Glossar

IDE

Integrated Development Environment. Ein Applikation, die mit zahlreichen Funktionen das Programmieren vereinfacht und zusätzlich erlaubt, den geschriebenen Code in der gleichen Oberfläche zu testen und debuggen. Ein Beispiel für eine solche Software ist KDevelop.

Infos

[1] Vim: http://www.vim.org

[2] Python-IDEs: http://wiki.python.org/moin/IntegratedDevelopmentEnvironments

[3] Eclipse: http://www.eclipse.org

[4] IPython: http://ipython.scipy.org

[5] PyChecker: http://pychecker.sourceforge.net

[6] PyLint: http://www.logilab.org/projects/pylint

[7] Retest: http://cthedot.de/retest

[8] Python-Homepage: http://www.python.org

[9] Python Package Index (PyPI): http://www.python.org/pypi

[10] Python Cookbook: http://aspn.activestate.com/ASPN/Python/Cookbook

[11] Python-Newsgroup: http://news:comp.lang.python

[12] Python-FAQs: http://www.python.org/doc/faq

[13] Python-Wiki: http://wiki.python.org/moin

[14] Deutsches Python-Wiki: http://wiki.python.de

[15] Deutsches Python-Forum: http://www.python-forum.de

[16] Deutsche Python-Newsgroup: http://news:de.comp.lang.python

[17] Deutsche Python-Mailingliste: http://python.net/mailman/listinfo/python-de

[18] Pythonmania-Blog: http://www.pythonmania.de

Einem Freund empfehlen    Druckansicht beenden Bookmark and Share
Kommentare