Springe zum Hauptinhalt
t.animal
Anagraphein!
t.animal
Anagraphein!

Projekte

Wenn ich Zeit habe, bin ich am Basteln. Hier landet Dokumentation zu fertigen und halbfertigen Projekten.

Dienstplanextraktor

Der Dienstplanextraktor™ ist eigentlich keine große Sache: Er nimmt ein PDF entgegen, wirft pdftotext darauf und extrahiert Mitarbeiter und Schichten. Dann erzeugt er auf Wunsch mit Latex ein PDF eines Mitarbeiters und trägt die Schichten in einen Google Kalender ein. Fanciere Dinge waren nicht möglich, da ich aus Datenschutzgründen nur ein gecroptes PDF mit den Daten eines einzelnen Mitarbeiters zur Verfügung hatte.

Die Anwendung beim 'Kunden'.

Die Anwendung beim 'Kunden'.

Spannend, weil für mich neu, waren eher die Begleitumstände: Das ganze sollte multilingual sein und auf Windows laufen. Außerdem brauchte es natürlich eine GUI, die aber schnell mit TKInter zusammen gestöpselt war. Daher hier, wie ich

  • dependencies manage
  • python Programme einfach unter Windows deploye (mit und ohne installer)
  • die Anwendung internationalisiert habe

Dependency management

Die Liste der Dependencies ist an sich nicht lang. Da wären pdflatex, pdftotext, diverse python-libraries (insbesondere aufgrund der google calendar Integration) und nicht zu vergessen: python selbst. Da es keine Option war, auf allen potentiell in Frage kommenden Rechnern alle dependencies zu installieren und es bekanntlich kein Paketmanagement für windows gibt, blieb nur übrig, alle dependencies mitzuliefern.

Pdflatex und pdftotext kommen praktischerweise mit TexLive in einem Paket und lassen sich schon unter Linux entpacken. TexLive ist portabel, sodass man es einfach in einem Unterordner installieren kann. Ein Problem ist die Größe des Ganzen (in der kleinsten Paketierung 170MB). Da bleibt nur, per Hand alle nicht benötigten Latex-Pakete zu entfernen und wenn doch Bedarf besteht wieder hinzuzufügen.

Mit Hilfe eines Snippets von Stackoverflow lassen sich leicht eventuell doch installierte Versionen bevorzugen.

Python unter Windows deployen

Wie bootstrapt man nun ein Python-Programm unter Windows, wenn man unter Umständen kein Python hat? Dafür gibt es u.a. pyinstaller, das zum einen alle Python-libraries paketiert und zum anderen Python selbst dazu in eine .exe packt. Leider muss man es dazu unter Windows ausführen und die Installation unter Windows gestaltet sich recht schwierig (genau deshalb war es ja keine Option, dies von den Anwendern zu verlangen). Die bisher praktikabelste Vorgehensweise ist: Python installieren, mit pip virtualenv installieren, sich ein virtualenv anlegen und darin pyinstaller zu installieren. Dann läuft allerdings noch nichts, außer man hat zufällig schon zwei weitere Pakete installiert. Wem das alles irgendwie fricklig vorkommt: Ist es auch. Aber als es mal lief, hat's funktioniert (auf den drei Maschinen, auf denen ich es getestet habe...).

Mit pyinstaller kann man jetzt entweder eine standalone .exe generieren, die sich selbst nach %TMP entpackt und von dort die Applikation startet. Oder man erhält einen Ordner mit allen nötigen Libraries und einem executable, das die Applikation startet. Letzteres lässt sich dann komfortabel mit NSIS zu einem Installer packen, der auch gleich einen Uninstaller und Verknüpfungen anlegt. Die installierte Variante startet dann auch schneller.

Ein Problem bleibt noch: Will man per subprocess und stdio mit anderen Programmen kommunizieren, kann man python nicht windowless starten - das heißt, es bleibt immer ein recht hässliches Konsolenfenster offen. Das kann man aber immerhin nach dem Start verstecken.

Python internationalisieren

Wie in den python docs empfohlen nutze ich pygettext und das gettext modul zur Locale-abhängigen Übersetzung von Strings. Die übersetzung habe ich mit poedit vorgenommen.

Eine Problem gab es noch mit dem python calendar Modul: Es lud weiterhin Englische Monats- und Wochentagsnamen, trotz Deutscher locale. Hier hilft, bei Programmstart einmal locale.setlocale(locale.LC_ALL, "") auszuführen. Außerdem sollte man beachten: Setzt man die Locale statt auf de_DE.utf8 auf de_DE schmiert einem das Programm beim Testen unter Garantie ab, wenn man das erste mal irgendwo auf Unicode trifft.