Python unter Linux: Überblick
In diesem Kapitel geben wir einen Überblick über Module, die meistens mitinstalliert werden. Anschließend wird eine Methode gezeigt, mit der man selbst mehr über unbekannte (aber auch vermeintlich bekannte) Module herausfinden kann.
Modul cmath
[Bearbeiten]Dieses Modul beinhaltet mathematische Funktionen zur Arbeit mit komplexen Zahlen. In Python haben komplexe Zahlen einen eigenen Typ, complex. Aufgeschrieben werden sie zum Beispiel als 5+3j[1].
Ein Beispiel:
#!/usr/bin/python import cmath z=5+4j print z print cmath.sqrt(z) user@localhost:~$ ./datei3.py
(5+4j)
(2.38779440462+0.837593050781j)
Modul datetime
[Bearbeiten]Das Modul datetime ist für die Verwaltung von Datum und Zeit zuständig. Dazu werden die Klassen time, date, datetime (Zusammenfassung von time und date) sowie timedelta (Zeitdifferenzen) und tzinfo (Zeitzoneninformationen) definiert. Die Verwendung von date wird in folgendem Programm demonstriert:
#!/usr/bin/python from datetime import date t=date(2008, 4, 10) print "Datum allgemein: " + str(t) print "Datum auf Deutsch: " + str(t.day) + "." + str(t.month) + "." + str(t.year) user@localhost:~$ ./date.py
Datum allgemein: 2008-04-10
Datum auf Deutsch: 10.4.2008
Hier folgt eine kurze Übersicht über einige der vorhandenen Methoden:
| Date-Funktionen | Bedeutung |
|---|---|
| fromtimestamp(timestamp) | Liefert das Datum passend zum Unix-Zeitstempel. Zeitstempel kann man von time.time() (Modul time) geliefert bekommen. |
| today() | Liefert das heutige Datum |
| year, month, day | (Klassenattribute) Repräsentieren das Jahr, den Monat und den Tag |
| Time-Funktionen | Bedeutung |
|---|---|
| hour, minute, second, microsecond | (Klassenattribute) Repräsentieren Stunde, Minute, Sekunde und Mikrosekunde |
| isoformat() | Liefert die Zeit im ISO8601-Format: HH:MM:SS.microsekunden |
| strftime(format) | Liefert die Zeit unter Verwendung von Formatangaben. Beispiele:
|
Modul getopt
[Bearbeiten]Funktionen innerhalb von getopt behandeln das Thema Kommandozeilenargumente:
| Funktion | Bedeutung |
|---|---|
| getopt(Argumente, kurzeOptionen, langeOptionen) | Liest Kommandozeilenoptionen, wie sie in Argumente übergeben wurden und vergleicht sie mit kurzeOptionen (-f, -h, ...) und langeOptionen (--file, --help, ...). Es werden zwei Listen zurückgegeben, eine enthält alle empfangenen Optionen einschließlich der Argumente, die andere Liste enthält alle Kommandozeilenargumente, denen keine Option vorangestellt wurde. |
| gnu_getopt(Argumente, kurzeOptionen, langeOptionen) | Wie oben, jedoch dürfen Options- und nicht-Optionsargumente gemischt werden. |
langeOptionen ist optional und enthält eine Liste mit Strings, die als lange Optionen interpretiert werden. Ein nachgestelltes Gleichheitszeichen bewirkt, dass diese Option ein Argument erwartet. kurzeOptionen ist ein String, der die Buchstaben zu den passenden Optionen beinhaltet. Ein einem Buchstaben nachgestellter Doppelpunkt bewirkt, dass diese Option ein Argument erwartet. Kommandozeilenparameter werden typischerweise von der Variablen sys.argv bereitgestellt, wobei sys.argv[0] der Skriptname ist. Beispiel:
#!/usr/bin/python import getopt import sys print "Alle Argumente: ", sys.argv shortOptions = 'hf:' longOptions = ['help', 'filename=', 'output='] def usage(): print sys.argv[0], "--help --filename=meinedatei [--output=ausgabedatei] ..." print sys.argv[0], "-h -f meinedatei ..." opts = [] args = [] try: opts, args = getopt.getopt(sys.argv[1:], shortOptions, longOptions) except getopt.GetoptError: print "ERR: Mindestens eine der Optionen ist nicht verfuegbar" usage() sys.exit() print "Optionenargumente:", opts print "Nicht-Optionen-Argumente:", args for o, a in opts: if o == "--help" or o == "-h": print "HELP" usage() elif o == "--filename" or o == "-f": print "Filename, Bearbeite Datei:", a elif o == "--output": print "Output, Dateiname:", a for a in args: print "Weiteres Argument, keine Option: ", a user@localhost:~$ ./getopt1.py --output test --filename test1 -f test2 test3
Alle Argumente: ['./getopt1.py', '--output', 'test', '--filename', 'test1', '-f', 'test2', 'test3']
Optionenargumente: [('--output', 'test'), ('--filename', 'test1'), ('-f', 'test2')]
Nicht-Optionen-Argumente: ['test3']
Output, Dateiname: test
Filename, Bearbeite Datei: test1
Filename, Bearbeite Datei: test2
Weiteres Argument, keine Option: test3
Falls eine Option eingegeben wurde, die nicht Bestandteil der kurzen oder Langen Optionsliste ist, dann wird die Exception getopt.GetoptError geworfen. Die Optionen -f, --filename und --output erwarten weitere Argumente.
Modul math
[Bearbeiten]Das Modul math enthält mathematische Funktionen und Konstanten. Die folgende Tabelle zeigt einen Auschnitt:
| Funktion | Bedeutung |
|---|---|
| e | Der Wert der Eulerkonstante 2.718... |
| pi | Der Wert der Kreiszahl pi 3.14... |
| sin(), cos() | Sinus, Kosinus eines Winkels im Bogenmaß |
| degrees() | Rechnet einen Winkel vom Bogenmaß in Grad um |
| radians() | Umrechnung Grad -> Bogenmaß |
| log(), exp() | Logarithmus, Exponentialfunktion |
Ein Beispiel:
#!/usr/bin/python import math print math.e print math.sin(math.pi/2) user@localhost:~$ ./math.py
2.71828182846
1.0
Modul os
[Bearbeiten]Dieses Modul beinhaltet Variablen und Funktionen, die stark vom eingesetzten Betriebssystem (Linux, Mac, OpenBSD, ...) abhängen.
Beispiel:
#!/usr/bin/python import os print "Arbeite unter " + os.name print "Dieses Programm ist unter " + os.curdir + os.sep + "ostest" + os.extsep + "py" + " zu erreichen" user@localhost:~$ ./ostest.py
Arbeite unter posix
Dieses Programm ist unter ./ostest.py zu erreichen
Anmerkung: Dieses Programm gibt unter verschiedenen Betriebssystemen unterschiedliche Ergebnisse aus.
Hier folgen einige nützliche Funktionen aus dem Modul:
Dateien und Verzeichnisse
[Bearbeiten]| Funktion | Bedeutung |
|---|---|
| chdir(pfad) | Wechselt in das angegebene Verzeichnis |
| chmod(pfad, modus) | Ändert die Modi (Lesen, Schreiben, Ausführen) der Datei mit dem Dateinamen pfad. |
| chown(pfad, uid, gid) | Ändert die Besitzrechte der Datei mit dem Namen pfad auf die der angegebenen UID und GID |
| close() | Datei wird geschlossen |
| curdir, pardir | (Konstanten) Kürzel für das aktuelle Verzeichnis (meist ".") oder das übergeordnete Verzeichnis ("..") |
| getcwd() | Liefert das aktuelle Arbeitsverzeichnis |
| listdir(pfad) | Erzeugt eine Liste mit dem Inhalt des angegebenen Verzeichnisses pfad. |
| lseek(fd, pos, how) | Positioniert den Dateizeiger der geöffneten Datei fd an die Position pos. how bestimmt, wie positioniert wird:
|
| name | (Konstanten) Kennung für das Betriebssystem (posix, os2, riscos, ...) |
| open(file, flags[, mode]) | file: Dateiname, flags: Modi der Art
Diese Flags können verodert werden. mode: Dateirechte, wie z. B. "0660" |
| read(fd, n) | Liest n Zeichen aus der offenen Datei fd. |
| remove(pfad), rmdir(pfad) | Entfernt eine Datei oder ein Verzeichnis (rekursiv). |
| write(fd, s) | Schreibt einen String s in die offene Datei fd. |
| sep, extsep | (Konstanten) Trennzeichen für Pfadnamen ("/") und Dateiendungen (".") |
| tmpfile() | Öffnet eine temporäre Datei im Modus "w+" |
Prozessmanagement
[Bearbeiten]| Funktion | Bedeutung |
|---|---|
| fork() | Erzeugt einen Kindprozess. Liefert 0, wenn dieses der Kindprozess ist, sonst die Prozessnummer (PID) des Kindes. |
| kill(pid, signal) | Sendet das Signal signal an den Prozess mit der angegebenen pid. |
| nice(wert) | Fügt dem aktuellen Prozess den Nicewert wert hinzu. |
| system(befehl) | Führt einen externen Befehl aus. |
Modul os.path
[Bearbeiten]Dieses Modul enthält Funktionen, die Auskunft über Dateien geben. Man kann Änderung- und Zugriffszeiten abfragen, feststellen, ob ein Pfad eine (existierende) Datei oder ein Verzeichnis ist und vieles mehr.
| Funktion | Bedeutung |
|---|---|
| exists(Pfad) | Liefert True, wenn Pfad existiert und das Programm das Recht hat, diesen Pfad einzusehen. |
| expanduser(~username) | Erzeugt einen Pfad, der das Home-Verzeichnis von Benutzer username ist. |
| getatime(Pfad), getmtime(Pfad) | Liefert die letzte Zugriffszeit oder die Änderungszeit |
| isfile(Pfad) | True, wenn der Pfad eine Datei darstellt |
| join(Pfad1, Pfad2, ...) | Fügt Pfade zusammen, wobei Pfad1 ein Verzeichnis sein kann, Pfad2 ein Verzeichnis innerhalb von Pfad1 oder eine Datei. |
Modul random
[Bearbeiten]Das Modul random stellt Funktionen zur Verfügung für die Erzeugung von Pseudozufallszahlen. Ein kleines Beispiel würfelt eine Zahl zwischen 1 und 6:
#!/usr/bin/python from random import randint # (Pseudo-)Zufallszahl ermitteln und als Wuerfelergebnis nehmen. def print_random(): wuerfel = randint(1, 6) print "Der Wurf ergibt " + str(wuerfel) # 5mal wuerfeln for i in range(0, 5): print_random() user@localhost:~$ ./wuerfeln.py
Der Wurf ergibt 2
Der Wurf ergibt 6
Der Wurf ergibt 5
Der Wurf ergibt 6
Der Wurf ergibt 2
Anmerkung: Dieses Programm gibt jedes mal andere Ergebnisse aus.
Modul readline
[Bearbeiten]Mit dem Modul readline kann eine Autovervollständigung im Stil der Bash in die Texteingabe eingebaut werden. Mit einer geeigneten Funktion zur Vervollständigung angefangener Wörter braucht man nur noch die Tabulatortaste drücken, um bereits eindeutige Eingaben zu vervollständigen.
Modul sys
[Bearbeiten]Hier folgt eine Auswahl interessanter Funktionen und Variablen innerhalb vom Modul sys.
| Funktion | Bedeutung |
|---|---|
| argv | Liste von Kommandozeilen, die dem Skript mitgegeben wurden |
| exit(Arg) | Der optionale Wert Arg wird ausgegeben, oder, wenn es eine Zahl ist, an den aufrufenden Prozess (zum Beispiel die bash) übergeben. |
| exitfunc | Diese Variable enthält den Wert einer Funktion, die als letzte vor dem Programmende aufgerufen wird. |
| path | Liste aller Modulsuchpfade |
| platform | Ein String, der die Plattform, also das Betriebssystem, identifiziert. |
| stdin | Eingabekanal (Datei) |
| version | Die aktuelle Python-Version |
Ein Beispielprogramm, wie man mit exit() und exitfunc umgeht:
#!/usr/bin/python import sys def LetzteWorte(): print "Das Gold befindet sich am ..." exitfunc = LetzteWorte() sys.exit(42)
user@localhost:~$ ./sys1.py
Das Gold befindet sich am ...
Leider verstarb das Programm, bevor es uns den Ort nennen konnte, wo das Gold liegt. Wir können den Rückgabewert des Skriptes in der bash bestimmen, in dem wir die Shell-Variable $? abfragen:
user@localhost:~$ echo $?
42
Das folgende Programm benutzt stdin, um einen Filter zu bauen. Mit dessen Hilfe können wir die Ausgabe eines Programmes als Eingabe unseres Programmes benutzen, um zum Beispiel Dateien mit Zeilennummern zu versehen:
#!/usr/bin/python import sys for n, l in enumerate(sys.stdin): print "%d: %s" % (n, l[:-1]) user@localhost:~$ ./sys2.py < sys2.py
0: #!/usr/bin/python
1: import sys
2:
3: for n, l in enumerate(sys.stdin):
4: print "%d: %s" % (n, l[:-1])
Alternativ hätten wir das Programm auch mit cat sys2.py | ./sys2.py aufrufen können.
Modul tarfile
[Bearbeiten]Das Modul tarfile ermöglicht die Behandlung von \.tar(\.gz|\.bz2)?-Dateien unter Python. Ein Beispiel:
#!/usr/bin/python from sys import argv import tarfile filename=argv[0] tarname=filename+".tar.gz" tar=tarfile.open(tarname, "w:gz") tar.add(filename) tar.close() file=open(filename) file.seek(0, 2) tar=open(tarname) tar.seek(0, 2) print "Original: " + str(file.tell()) + " Bytes" print "Compressed: " + str(tar.tell()) + " Bytes" # Noch ein paar Kommentare, damit die Datei gross genug ist. :-) # Bei zu kleinen Dateien wirkt sich die Kompression negativ aus. user@localhost:~$ ./tar.py
Original: 464 Bytes
Compressed: 403 Bytes
Modul time
[Bearbeiten]Das Modul time stellt Funktionen für das Rechnen mit Zeit zur Verfügung. Es sollte nicht mit der Klasse time im Modul datetime verwechselt werden. Ein Beispielprogramm:
#!/usr/bin/python from time import clock, strftime def do_loop(limit): start_time=clock() for i in range(1,limit): for j in range(1,limit): pass end_time=clock() return end_time - start_time def calibrate(): limit=1 elapsed=0.0 while (elapsed<1.0): limit=limit*2 elapsed=do_loop(limit) return limit print 'Kalibriere Zeitrechnung...' limit = calibrate() print 'Rechne (' + str(limit) + ')^2 Schleifen...' print 'Vorher: ' + strftime('%X') elapsed=do_loop(limit) print 'Nachher: ' + strftime('%X') print "Gemessene Zeit: " + str(elapsed) + "s" user@localhost:~$ ./timing.py
Kalibriere Zeitrechnung...
Rechne (4096)^2 Schleifen...
Vorher: 17:14:57
Nachher: 17:14:58
Gemessene Zeit: 1.16s
Modul uu
[Bearbeiten]Das folgende Programm kodiert und dekodiert sich selbst:
#!/usr/bin/python from sys import argv from uu import encode, decode infile=argv[0] tmpfile=infile+".uu" outfile=tmpfile+".py" encode(infile, tmpfile) decode(tmpfile, outfile) file=open(outfile) data=file.read() lines=data.splitlines() for line in lines: print line Die Ausgabe soll hier nicht extra aufgeführt werden, da sie identisch mit dem Programmcode ist. Für die Interessierten hier die dabei erzeugte Datei uudemo.py.uu:
begin 755 uudemo.py M(R$O=7-R+V)I;B]P>71H;VX*9G)O;2!S>7,@:6UP;W)T(&%R9W8*9G)O;2!U M=2!I;7!O<G0@96YC;V1E+"!D96-O9&4*"FEN9FEL93UA<F=V6S!="G1M<&9I M;&4]:6YF:6QE*R(N=74B"F]U=&9I;&4]=&UP9FEL92LB+G!Y(@H*96YC;V1E M*&EN9FEL92P@=&UP9FEL92D*9&5C;V1E*'1M<&9I;&4L(&]U=&9I;&4I"@IF M:6QE/6]P96XH;W5T9FEL92D*9&%T83UF:6QE+G)E860H*0IL:6YE<SUD871A M+G-P;&ET;&EN97,H*0IF;W(@;&EN92!I;B!L:6YE<SH*(" @("!P<FEN="!L $:6YE"@ end Allgemeine Informationen über Module
[Bearbeiten]Das folgende Skript zeigt, wie man mehr über ein Modul herausfindet, von dem man nur den Namen kennt.
#!/usr/bin/python import os help(os) print dir(os) Die Funktionen help() und dir() geben nützliche Informationen über die Module aus. Es ist recht praktisch, sie im interaktiven Modus (siehe Kapitel Erste Schritte) einzugeben.
Anmerkungen
[Bearbeiten]- ↑ In der deutschsprachigen Literatur zu komplexen Zahlen ist das "i" häufig anzutreffen.