Python

Allgemein

Tutorials

Install Python modules on Windows

Example for module screeninfo, but it works as well for e.g. matplotlib, pandas etc.

C:\Users\Stefan> cd \Software\Python27     # or: Python34 or similar
C:\Software\Python27> python.exe -m pip install screeninfo
Collecting screeninfo
  Downloading screeninfo-0.2.1.tar.gz
Installing collected packages: screeninfo
  Running setup.py install for screeninfo ... done
Successfully installed screeninfo-0.2.1

Python Kochbuch

Miscellaneous

import sys
sys.stdout.write('Text printed without newline')
  • Parsing command line options Parsing command line options
    • optparse (English) @ Python Standard Library Documentation
    • optparse (German) @ Galileo OpenBook
  • screeninfo
    • Fetch location and size of physical screens; system-independent for Windows (nativ & cygwin) and Linux.
    • Install: pip install screeninfo

atexit – Befehle ausführen bei Programmende

Häufig kommt es vor, dass man irgendwelche Aktionen startet (z. B. schreiben temporärer Dateien, öffnen einer Datenbanken etc.), die auf jeden Fall vor Beendigung des Programms noch beendet werden sollten/müssen (z. B. temporäre Dateien löschen, Datenbank schließen oder im Speicher befindliche Daten persistieren).

Bei komplexeren Programmen und in Fehlerfällen gibt es meist an verschiedensten Stellen im Programm Ausstiegspunkte; und nicht nur am Ende von main(), so dass man an jeder einzelnen Stelle dran denken muss, vorher noch einen cleanup auszuführen. Das ist lästig und fehleranfällig, weil es leicht vergessen wird.

Einfacher geht das über das Modul atexit, wie das folgende Beispiel zeigt:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys
import atexit

def exitHandler():
   print "Cleaning temporary files..."
   # delete temporary files
   # write last message to log
   # ...

atexit.register(exitHandler)

sys.exit(0)

Output:

Cleaning temporary files...

Man muss also nie wieder irgendwo explizit eine Cleanup-Funktion aufrufen, da der exitHandler() immer automatisch ausgeführt wird.

signal – Signale abfangen und verarbeiten

Genauso wie bei atexit (siehe oben), sollte auch beim Abbruch eines Programms durch den User (z. B. durch Drücken von “Ctrl-C” oder Ausführen von “kill”) am Ende immer noch alles sauber aufgeräumt werden (DB-Verbindungen schließen, temporäre Files löschen, Daten persistieren etc.).

Dazu muss man die entsprechenden Signale abfangen, was einfach über das Modul signal geht:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import time
import sys
import signal
 
def signalHandler(signum, frame):
    # Klartextnamen für Signal-Nummern ermitteln.
    SIGNALS_TO_NAMES_DICT = dict((getattr(signal, n), n) \
        for n in dir(signal) if n.startswith('SIG') and '_' not in n )
    signame = SIGNALS_TO_NAMES_DICT.get(signum,
                                        "Unnamed signal: %d" % signum)
 
    # Bei bestimmten Signalen Programm beenden,
    # bei anderen nur Empfang melden.
    if signum in (signal.SIGINT, signal.SIGTERM):
        exitCode = 1
        print "\nSignal '%s' (%d) received. => Aborting with exit code %d.") % (signame, signum, exitCode)
        sys.exit(exitCode)
    else:
        print "Signal %d received and ignored." % signum
 
signal.signal(signal.SIGINT,  signalHandler)
signal.signal(signal.SIGTERM, signalHandler)
signal.signal(signal.SIGHUP,  signalHandler)
 
print "Waiting... (press Ctrl-C to terminate)"
time.sleep(10)
 
sys.exit(0)

Output (mit Drücken von Ctrl-C innerhalb von 10 Sekunden):

Waiting... (press Ctrl-C to terminate)
^C
Signal 'SIGINT' (2) received. => Aborting with exit code 1.

Natürlich lassen sich Signale wie SIGHUP, SIGUSR1 oder SIGUSR2 o.ä. auch gut nutzen, um Aktionen wie ein Reread der Config oder das Wegschreiben von Statusinformationen zu triggern.

Da das Aufräumen am Ende eines Programms zum guten Programmierstil gehört, sollte die Verwendung von Signal-Handlern für jedes nicht-triviale python-Programm verpflichtend sein.

Spezielle Themen

XML

Networking

Sprachausgabe

SQLite

Sybase/SAP Databases

Stefan Leupers ist verheiratet und hat zwei Töchter. Seinen ersten Computer bekam er 1984 mit 11 Jahren. Er studierte Diplom-Informatik an der RWTH Aachen und beschäftigt sich seit 1993 mit Linux. Zu seinen Interessentgebieten zählen seit dem Studium Kommunikationssysteme sowie seit 2013 auch Heimautomation; insbesondere FHEM. Seit 2016 fährt er Liegedreirad und seit 2018 Elektroauto. Die Elektroautos werden - zumindest von Frühling bis Herbst - vorwiegend mit selbst erzeugtem PV-Strom vom eigenen Dach geladen.

Getagged mit: , , , ,