Kapitel 2. Users Guide

Inhaltsverzeichnis

Einführung in Python
Python-Grundlagen
Blöcke, Funktionen und Exceptions
Mit Modulen arbeiten
Ein erster Blick auf das Incoming- und Idle-Skript
Das Incoming-Skript
Das Idle-Skript
Verwendete Dateiformate
Format der Sprach-Dateien (invertiert A-Law, 8kHz, mono)
Format von Fax-Dateien (Structured Fax Files)
Tutorial: Ein Incoming-Skript schreiben
Grundlagen und ein wirklich dummer Anrufbeantworter
Verbesserungen in eine brauchbaren (?) Zustand
Verwendung vernünftiger Dateinamen
Automatische Fax-Erkennung und -Empfang
Beispiel eines Idle-Skripts
Struktureller überblick über die Standard-Skripte
incoming.py
idle.py
capisuitefax
cs_helpers.py
CapiSuite-Befehlsreferenz

Im vorigen Kapitel haben Sie gesehen, wie die mit CapiSuite gelieferten Standard-Skripte genutzt werden. Das Hauptziel bei der Entwicklung von CapiSuite war aber nicht, eine perfekte "Ready-to-Use"-Anwendung zur Verfügung zu stellen. Ich wollte ein Tool entwickeln, mit dem jeder auf einfache Weise seine eigenen Anwendungen schreiben kann. Ich werde Ihnen in den nächsten Abschnitten zeigen, wie das geht.

Einführung in Python

Als ich über die Skriptsprache nachdachte, die ich in CapiSuite integrieren wollte, war meine erste Idee, eine eigene, einfache zu entwickeln. Aber je tiefer ich in das Thema einstieg, desto mehr stellte sich heraus, dass eine allgemeine Sprache sehr viel nützlicher sein würde, als jedes benötigte Rad neu zu erfinden. Also suchte ich nach einer einfach zu integrierenden (und zu lernenden) Sprache. Die, die mir am besten gefiel, war Python - und sie hatte eine schöne Dokumentation über das Einbettten in andere Applikation. Deshalb habe ich mich für sie entschieden und ich habe es bis jetzt nicht bereut. :-)

Also, die erste Sache, die zu tun ist, ist Python zu lernen. Aber keine Angst - sie wurde als eine Anfängersprache entwickelt und Guido (Guido van Rossum, der Erfinder von Python) hat das meiner Meinung nach sehr gut gemacht.

In den nächsten Abschnitten werde ich Ihnen eine kurze Einführung in die Features von Python geben, die Sie am häufigsten für CapiSuite brauchen werden. Da dies weder ein Python-Handbuch noch ein Programmier-Tutorial sein soll, gehe ich davon aus, dass Sie bereits mit den Grundkonzpten heutiger verbreiteter prozeduraler und objektorientierter Sprachen vertraut sind.

Wenn nicht, empfehle ich Ihnen, mit Hilfe eines Buchs Python zu erlernen - es gibt viele davon in verschiedenen Sprachen. Auf der Python-Homepage unter http://www.python.org finden Sie ein reichhaltiges Angebot an kostenlosen Handbüchern und Tutorials.

Python-Grundlagen

Python unterstützt die meisten Features, die Sie von anderen Sprachen kennen. Hier ist die Syntax der Basisoperationen einer Python-Session. Eine Python-Session ist ein nettes Feature des Interpreters: sie wird einfach gestartet, indem Sie python in einer Shell eingeben und Sie erhalten eine Eingabeaufforderung:

gernot@linux:~> python
Python 2.2.1 (#1, Sep 10 2002, 17:49:17)
[GCC 3.2] on linux2
Type "help", "copyright", "credits" or "license" for more
information.
>>>

Wie Sie sehen, ist die Eingabeaufforderung von Python >>>. Wenn Sie mehrzeilige Befehle eingeben, zeigt Python eine zweite Eingabeaufforderung an: ...

>>> if (1==2):
...     print "Now THAT's interesting!"
...

Ok, gehen wir weiter:

>>> # Kommentare beginnen mit # am Anfang der Zeile
>>> # jetzt die gewöhnlichen ersten Schritte
>>> print "hello world"
hello world
>>> # Variablen
>>> a=5 # keine separate Deklarationen erforderlich
>>> b=a*2
>>> print b
10
>>> b='hello'
>>> print b,'world'
hello world
>>> # Python ist sehr mächtig bzgl. Sequenzen
>>> a=(1,2,3) # definiert ein Tuple (nicht änderbar!)
>>> print a
(1, 2, 3)
>>> a[1]=2  # dies geht schief
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment
>>> a=[1,2,3] # definiert eine Liste (änderbar)
>>> a[1]=7
>>> print a
[1, 7, 3]
>>> # Kontrollstrukturen
>>> if (b=='hello'):
...     print "b is hello"
... else:
...     print "????"
...
b is hello
>>> # das for-Statement kann über Sequenzen iterieren
>>> for i in a:
...     print i
...
1
7
3
>>> # ersetze Positionen 1 bis 3 (ohne 3) mit 0
>>> a[1:3]=[0]
>>> a
[1, 0]
>>> # a[-i] ist das i-te Element von hinten gezählt
>>> a[-1]=7; a[-2]=8
>>> a
[8, 7]

Blöcke, Funktionen und Exceptions

Blöcke werden nur durch Einrückung gebildet. Kein begin, end, Klammern ({, }) oder ähnliches ist nötig. Dies sieht auf den ersten Blick etwas unbequem aus, aber es ist wirklich nett - Sie müssen Ihren Code immer so strukturieren, wie er gemeint ist:

>>> for i in [1,2,3]:
...     print 2*i
...
2
4
6
>>> i=0
>>> while (i!=3):
...     print i
...     i+=1
...
0
1
2

Schauen wir uns nun an, wie Funktionen definiert werden und wie man mit Exceptions arbeitet:

>>> def double_it(a):
...     return (2*a)
...
>>> print double_it(9)
18
>>> print double_it("hello")
hellohello
>>>
>>> # wir lösen eine Exception aus
>>> a=1/0
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
>>>
>>> # jetzt reagieren wir darauf
>>> try:
...     a=1/0
... except ZeroDivisionError,e:
...     print "You divided by zero, message was:",e
...
You divided by zero, message was: integer division or modulo by zero

Mit Modulen arbeiten

Module sind eine Möglichkeit, Funktionen zusammen zu packen. Sie müssen importiert werden, bevor Sie sie benutzen können und sie stellen Ihnen ein neues Objekt zur Verfügung, das alle Funktionen enthält. Lassen Sie uns mit einigen etwas herumspielen:

>>> import time
>>> # was ist in time?
>>> dir(time)
['__doc__', '__file__', '__name__', 'accept2dyear', ...]
>>> # Was machen all diese Funktionen? Python sagt es uns...
>>> print time.__doc__
This module provides various functions to manipulate time values.

[...]

Variables:

[...]

Functions:

time() -- return current time in seconds since the Epoch as a float
ctime() -- convert time in seconds to string
[...]

>>> # Kannst du mir ctime bitte etwas genauer erklären?
>>> print time.ctime.__doc__
ctime(seconds) -> string

Convert a time in seconds since the Epoch to a string in local time.
This is equivalent to asctime(localtime(seconds)). When the time tuple
is not present, current time as returned by localtime() is used.

>>> time.time()
1044380131.186987
>>> time.ctime()
'Tue Feb  4 18:35:36 2003'
>>> import os
>>> os.getuid()
500
>>> import pwd
>>> pwd.getpwuid(500)
('hans', 'x', 500, 100, 'Hans Meier', '/home/gernot', '/bin/bash')

Ok, ich hoffe, Sie haben einen kleinen Eindruck von Python bekommen. Viel Spaß damit. Ich hatte ihn... :-)

Wenn Sie weitere Fragen haben, würde ich Ihnen wirklich empfehlen, mit einem guten Buch oder der Dokumentation auf http://www.python.org weiter zu machen. Bitte stellen Sie keine allgemeinen Python-Fragen auf den CapiSuite-Listen...