Test-Driven Design mit Python
Am 12.06.2019 habe ich einen kurzen Vortrag zum Thema TDD (Test-Driven Design) bei der PyDDF in Düsseldorf gehalten. Hier die Folien.
Textsatz mit \LaTeX, Programmieren, Zahlen, etc.
Archive for the ‘Programmierung’ Category.
Am 12.06.2019 habe ich einen kurzen Vortrag zum Thema TDD (Test-Driven Design) bei der PyDDF in Düsseldorf gehalten. Hier die Folien.
Hier ein Beispiel, wie man per Drag & Drop Python-Skripte ausführen kann.
In eine entsprechende Batch-Datei kommt der folgende Aufruf
C:\WinPython-32bit-3.3.5.5\python-3.3.5\python.exe dragdrop.py %1 > error.log 2>&1
In die dragdrop.py kommt dann der eigentliche Python-Code, hier wird die „gedroppte“ Excel-Datei in CSV umgewandelt.
import sys import os import pandas as pd droppedFile = sys.argv[1] filename = os.path.splitext(droppedFile)[0] df = pd.read_excel(droppedFile, skiprows=[0,1,2,3]) df.to_csv(filename +'.csv', sep=';', index=False)
Für das „Rahmenwerk“ rund um eine Datenauswertung nutze ich immer den selben Code, der a) die Auswertung von Kommandozeilenparametern b) Zeitstempel und c) das Logging übernimmt. Geloggt wird auf STDOUT und in eine Datei.
import pandas as pd # pandas import argparse # Kommandozeilenargumente import logging # Logging import sys # für das Logging import time # für den Zeitstempel # Zeitstempel timestr = time.strftime('%Y%m%d') # '%Y%m%d-%H%M%S' # Logger in Datei und auf die Konsole logger = logging.getLogger("Logfile.log") logger.propagate = False logger.setLevel(logging.DEBUG) fileHandler = logging.FileHandler(logger.name + '_' + timestr + ".log",mode='w') fileHandler_format = logging.Formatter('%(asctime)s_%(levelname)s_%(message)s',datefmt='%H:%M:%S') fileHandler.setFormatter(fileHandler_format) consoleHandler = logging.StreamHandler(sys.stdout) #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') consoleHandler.setFormatter(fileHandler_format) if logger.handlers: for handler in logger.handlers: logger.removeHandler(handler) logger.addHandler(fileHandler) logger.addHandler(consoleHandler) # Zum Auswerten der Kommandozeilenparameter (siehe Aufruf aus Excel) # Definiere Parameter parser = argparse.ArgumentParser("Was bin ich") parser.add_argument('-c','--currentdate',dest='currentdate') parser.add_argument('-l','--lastdate',dest='lastdate') parser.add_argument('-o','--outputfile',dest='outputpath') # verarbeite Kommandozeilenargumente logger.info('Verarbeite die Kommandozeilenargumente') args = parser.parse_args() # no more "A value is trying to be set on a copy of a slice from a DF" warning pd.options.mode.chained_assignment = None print('args.currentdate', args.currentdate) print('args.lastdate', args.lastdate) print('args.outputpath', args.outputpath) logging.shutdown()
Das minted-Syntaxhighlighting für eingebetteten Code funktioniert natürlich auch für Beamer-Präsentationen. (Hinweis: Python und pygments müssen installiert sein, --shell-escape
muss aktiviert sein)
\documentclass[12pt]{beamer} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{xcolor} \definecolor{colBack}{rgb}{1,1,0.8} \usepackage{minted} \setminted[python]{frame=lines, framesep=2mm, baselinestretch=1.2, bgcolor=colBack,fontsize=\footnotesize,linenos} \setminted[text]{frame=lines, framesep=2mm, baselinestretch=1.2, bgcolor=colBack,fontsize=\footnotesize,linenos} \usepackage{fancyvrb} \makeatletter \newenvironment{pycode}[1]% {\xdef\d@tn@me{#1}\xdef\r@ncmd{python #1.py > #1.plog}% \typeout{Writing file #1}\VerbatimOut{#1.py}% } {\endVerbatimOut % \toks0{\immediate\write18}% \expandafter\toks\expandafter1\expandafter{\r@ncmd}% \edef\d@r@ncmd{\the\toks0{\the\toks1}}\d@r@ncmd % \noindent Input \inputminted{python}{\d@tn@me.py}% \noindent Output \inputminted{text}{\d@tn@me.plog}% } \makeatother \begin{document} \begin{frame}[containsverbatim] \frametitle{Python Code Evaluation} \begin{pycode}{abc} import pandas as pd print(pd.__version__); print(123+456) \end{pycode} \end{frame} \end{document} |
Hier ein Beispiel, wie man aus LaTeX-Dateien heraus a) Dateien schreibt b) diese Dateien durch einen externen Interpreter (in diesem Fall Python) ausführen lässt, c) die Ergebnisse wieder in TeX anzeigt und d) dabei das Syntax-Highlighting durch pygments
erledigen lässt.
Wichtig: --shell-escape
muss aktiviert sein, eine Python-Distribution (ich bevorzuge Anaconda) muss installiert sein, Python im Pfad sein.
Das Beispiel lässt sich leicht auf alle anderen Sprachen ausweiten, die im Batch-Verfahren ausführbar sind.
English: The following example shows how one can write code for external interpreters directly in LaTeX. During compilation the code is written to external files, run be the interpreter, its results stored in the corresponding .plog
output file. Syntax hightlighting is done via pygments
. --shell-escape
must be set for the TeX-compiler!
\documentclass[12pt]{scrartcl} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{xcolor} \definecolor{colBack}{rgb}{1,1,0.8} \usepackage{minted} \setminted[python]{frame=lines, framesep=2mm, baselinestretch=1.2, bgcolor=colBack,fontsize=\footnotesize,linenos} \setminted[text]{frame=lines, framesep=2mm, baselinestretch=1.2, bgcolor=colBack,fontsize=\footnotesize,linenos} \usepackage{fancyvrb} \makeatletter \newenvironment{pycode}[1]% {\xdef\d@tn@me{#1}\xdef\r@ncmd{python #1.py > #1.plog}% \typeout{Writing file #1}\VerbatimOut{#1.py}% } {\endVerbatimOut % \toks0{\immediate\write18}% \expandafter\toks\expandafter1\expandafter{\r@ncmd}% \edef\d@r@ncmd{\the\toks0{\the\toks1}}\d@r@ncmd % \noindent Input \inputminted{python}{\d@tn@me.py}% \noindent Output \inputminted{text}{\d@tn@me.plog}% } \makeatother \begin{document} \begin{pycode}{abc} import pandas as pd print(pd.__version__); print(1+123424) \end{pycode} \end{document} |
In der Jupyter-Konfiguration gibt es zwar eine Zeile für den Browser, das Anpassen dieser Zeile hatte bei mir aber keinen Erfolg. Erfolgreich war ich dann mit einer SX Antwort:
#c.NotebookApp.browser = '' import webbrowser webbrowser.register('chrome', None, webbrowser.GenericBrowser('C:\\Chrome\\Application\\chrome.exe')) c.NotebookApp.browser = 'chrome' |
A while ago I had some issues retrieving data from MySQL using Python, as my Python was more up-to-date than the official bindings. A few days ago I found a nice GIST (https://gist.github.com/stefanthoss/364b2a99521d5bb76d51) that uses pymysql:
import pandas as pd import pymysql from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://<user>:<password>@<host>[:<port>]/<dbname>') df = pd.read_sql_query('SELECT * FROM table', engine) df.head() |
Graphviz ist seit Jahrzehnten das Tool, um Graphen zu erstellen. Für Visual Studio Code gibt es mit dem „Graphviz Preview“ Plugin die Möglichlkeit, eine Echtzeit-Preview zu erhalten. Dann fühlt es sich fast an wie Visio 🙂
Hier die Quelle für diesen Tipp: https://spin.atomicobject.com/2017/11/15/table-rel-diagrams-graphviz/
Tipp: Graphviz muss natürlich installiert und im Pfad sein, die Preview aktiviert man dann in VSC über
Unter Windows nutze ich schon seit Jahren UltraEdit für das Bearbeiten von Textdateien.
Mittels
Nachdem wir jetzt den API-Schlüssel erstellt haben, können wir ihn zur Abfrage der Konfiguration nutzen. Dazu geht man auf die
Seite und trägt unter URL /api/#Schlüssel#
ein. Nach dem Drücken des GET Buttons erhält man dann im Command Response Fenster die Ausgabe, die aus JSON-Teilen für Lampen, Gruppen und der Konfiguration besteht. Da ich einige Lampen und Gruppen habe, kommen bei mir etwas über 5000 Zeilen zurück.
Die JSON-Struktur ist hierarchisch aufgebaut, durch leichte Anpassungen der URL kann man auf die einzelnen Teile der Konfiguration zugreifen, so erhält man durch
/api/#Schlüssel#/lights
den Abschnitt mit den Lampen/api/#Schlüssel#/lights/1
den Abschnitt von Lampe 1/api/#Schlüssel#/groups
den Abschnitt mit den Gruppen/api/#Schlüssel#/config
die SystemkonfigurationLampen steuern
Um jetzt einzelne Eigenschaften wie an/aus, Helligkeit und Farbe zu setzen, müssen wir per „PUT“ (nicht „GET“) entsprechende JSON-Schnipsel absenden. Das folgende Beispiel schaltet Lampe 9 aus:
/api/#Schlüssel#/lights/9/state
{"on":false}
und das folgende wieder an:
/api/#Schlüssel#/lights/9/state
{"on":true}
Hier jetzt noch das wichtigste Beispiel, das nicht nur an/aus kontrolliert, sondern auch Farbe und Helligkeit:
/api/#Schlüssel#/lights/9/state
{"on":true, "sat":254,"bri":254, "hue":30000}
Im nächsten Teil dieser Serie schauen wir uns dann an, wie die einzelnen Komponenten umgewandelt werden müssen, um die gewünschte Farbe und Helligkeit zu erhalten.