Kapitel 14: Python-Installation, Shell, Werkzeuge Grundlagen der Programmierung 1 Holger Karl Wintersemester 2016/2017 Inhaltsverzeichnis Inhaltsverzeichnis 1 Abbildungsverzeichnis 2 Liste von Definitionen u.ä. 14.1 Überblick . . . . . . . . 14.2 Python: Installation . . 14.3 Editoren, IDEs . . . . . 14.4 Debugging und Testing 14.5 Testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 3 6 7 11 14.6 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . 12 Abbildungsverzeichnis 14.1 14.2 14.3 14.4 14.5 Start eines Terminalfensters in Jupyterhub Emacs thumbs . . . . . . . . . . . . . . . . Aufwand der Fehlerbeseitigung . . . . . . Wissen der Alten . . . . . . . . . . . . . . Good debuggers help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 . 6 . 7 . 9 . 11 Liste von Definitionen u.ä. 2 14.1. Überblick 14.1 14.1.1 Überblick Was bisher geschah • Wir haben Python-Programme bisher in zwei Kontexten entwickelt bzw. ausgeführt : – Im einem Jupyter-Notebook – Im Pythontutor • Didaktisch (hoffentlich) wertvoll, aber für Produktiveinsatz nur bedingt geeignet – Jupyter-Notebooks: durchaus auch produktiv! 14.1.2 Dieses Kapitel • Installation von Python • Installation von Modulen • Werkzeuge: – Editoren, Entwicklungsumgebungen – Debugger • Debugging und Test-Techniken 14.2 14.2.1 Python: Installation Installation • Webseite für Download • Ordentliches Betriebssystem: In der Regel vorhanden – Falls bestimmte Version fehlt: Bordmittel (apt-get install ... u.ä.) • Windows: Viel Glück! 14.2.2 Python im Terminal • Der Python-Interpreter kann direkt als Programm aufgerufen werden • Führt dann REPL aus – Read: Von Eingabe, Tastatur – Print: Auf Ausgabe, Bildschirm • In Jupyterhub ganz einfach: New Terminal 3 4 Liste von Definitionen u.ä. Abbildung 14.1: Start eines Terminalfensters in Jupyterhub Abbildung 14.1 zeigt, wie Sie aus der Jupyterhub-Webseite einfach ein Terminal starten können. Die Übungen werden mehr Details zur Nutzung von Terminals, shells, etc. enthalten. 14.2.3 Packages installieren Standardwerkzeuge für weitere Packages pip • • • • • 14.2.4 Website Übersicht lokal installierter Packages: pip list Details zu Package: pip show MODULNAME Suche nach Package: pip search MODU Referenz: Python Package Index, mit 87310 Packages (August 2016) Gekapselte Installation • Standardinstallation: Neue Packages werden an vordefiniertem Ort gespeichert – Erfordert in der Regel Adminstrator-Rechte – Könnte andere Packages überschreiben – Verhindert, unterschiedliche Versionen auszuprobieren – Möglicherweise vertragen sich nicht alle Packages mit einander – Packages können unterschiedliche Anforderungen stellen • Daher: Für Packages gekapselte Installationsorte bereitstellen – Virtual environments • Werkzeug: Virtualenv 14.2. Python: Installation 14.2.5 Virtualenv • Erzeugt und verwaltet virtuelle Python-Installationen – Jede bekommt abgekapselten Installationsort – Eigenen Satz der installierten Packages – Ohne Adminstrator-Rechte möglich! • Nutzung: einfacher mit virtualenvwrapper 14.2.6 Virtualenvwrapper • • • • • • 14.2.7 $> pip install virtualenvwrapper $> mkvirtualenv jupyter $> workon jupyter (jupyter) $> pip install jupyter ... (jupyter) $> deactivate Nützliche Non-Standard-Module • bpython: Stark verbesserte interaktive Nutzung des Interpreters – Z.B. mit Vorschlägen verfügbarer Methoden bei Objekt, samt docstring • requests: Package, um mit HTTP einfach umzugehen 1 2 3 import requests r = requests.get("http://www.google.de") print(r.json) • Und viele mehr: Liste 1, Liste 2, Liste 3 14.2.8 Matplotlib • Matplotlib: Alle Arten von Plots 1 2 3 %matplotlib notebook import matplotlib.pyplot as plt import math 4 5 6 x = [xx/50 for xx in range(0, 600)] y = list(map(math.sin, x)) 7 8 plt.plot(x, y) 5 6 Liste von Definitionen u.ä. 14.3 14.3.1 Editoren, IDEs Editoren mit Unterstützung für Programmiersprachen • Python-Dateien mit trivialen Editoren anfertigen? Notepad, textedit? • Editor mit Unterstützung für Programmiersprachen – Syntax: Formatierung, Highlighting, Einrückungen . . . – Semantik: Verfügbare Funktionen, Klassen, Methoden, . . . * Schwierig in dynamisch typisierten Sprachen – Integration mit anderen Werkzeugen (Dokumentation, Debugger, Tests, . . . ) • Ideal: Plattformunabhängig 14.3.2 Editoren, Beispiele – Open-source Beispiele • VIM: kompakt, schnell, aber etwas kryptische Bedienung • Atom: modern, Javascript-basiert und dadurch erweiterbar ; weniger mächtig als Emacs • Notepad++: Windows-only, aber angeblich trotzdem ganz gut • Emacs: DER Editor für Erwachsene – Lisp-basiert, dadurch erweiterbar – Umfangreiche Sammlung an Modulen für alles mögliche – GP1 wurde durch Emacs möglich – Org-mode – Mit diversen Clones für unterschiedliche OS, z.B. Aquamacs 14.3.3 Emacs Abbildung 14.2: Emacs thumbs 14.3.4 Editoren, Beispiele – Kommerzielle Beispiele • SublimeText: OSX, aber recht bekannt • Smultron: OSX, Neuauflage, vielleicht vielversprechend Siehe auch: Übersicht Python-Editoren 14.4. Debugging und Testing 14.3.5 Integrated Development Environment • Mehr als ein Editor, vereint weitere Werkzeuge in einem User Interface (nicht notwendigerweise in einem Programm) – Aber Grenze ist fließend • IDEs typischerweise: sehr komplex, funktionsüberladen, komplizierter Einstieg – Sie sollen Programmier, nicht IDE-Bediener werden – Hoher Einarbeitungsaufwand lohnt nur bei intensiver Nutzung • Beispiele – Kommerzielle: PyCharm (mit kostenloser Community Edition) – Open-Source: Eclipse mit PyDev – Weitere Beispiele: WingIDE, KommodoIDE, KDevelop, . . . 14.4 Debugging und Testing 14.4.1 Fehlersuche mit print? • Kaum ein Programm wird fehlerfrei erschaffen • Wie sucht man Fehler? – Testfälle! * Automatisiert testen? – print – überall – Noch mehr print 14.4.2 Aspekte der Fehlersuche • Strukturiert Vorgehen? – Leider wenig Literatur – Aber Ideen hier und da; siehe z.B. code:union blog, codementor blog, weitere Blog • Werkzeug? 14.4.3 Aufwand der Fehlerbeseitigung Abbildung 14.3: Aufwand der Fehlerbeseitigung 7 8 Liste von Definitionen u.ä. 14.4.4 Vorgehen: Basics [Es passiert nichts unmögliches] When you have eliminated the impossible, whatever remains, however improbable, must be the truth. Sherlock Holmes in The Sign of the Four 14.4.5 Vorgehen: Fragen stellen Es geht nicht ist nicht hilfreich • Fragen an sich selbst: – Warum gehe ich davon aus, dass der Code nicht funktioniert? – Was habe ich eigentlich erwartet? Warum? * Auf welcher Granularitätsebene sollte ich das beantworten? * Vielleicht habe ich die Spezifikation falsch verstanden? – Was ist stattdessen passiert? Woher weiß ich das? • Weitere Hilfsfragen: – Fehlerverhalten eingrenzbar? – Hat eine Änderung zu Fehlern geführt? 14.4.6 Vorgehen: Annahmen überprüfen Annahmen überprüfen! • Mein Code hat keine Schreibfehler; alle Variablen sind richtig geschrieben – Typische Falle in dynamischen Sprachen! • Verständnis der Schnittstelle benutzten Codes; insbesondere defaults – Beispiel: list.pop hat einen ungewöhnlichen Default-Wert! – Beispiel: Werden alle Parameter einer Funktion korrekt angegeben? Fehler kann viel später im Code manifestieren 14.4.7 Vorgehen: Reproduzieren Was muss ich tun, um den Fehler zu reproduzieren? • Gibt es unterschiedliche Eingaben, Zustände, die zum gleichen Fehler führen? • Entscheidend bei der Dokumentation von Fehlern! – Testfälle dokumentieren 14.4.8 Vorgehen: Erklären Sie Ihren Code! • Erklären Sie, warum der Code funktioniert – Und der Fehler eigentlich nicht auftreten kann 14.4. Debugging und Testing • Einem Kommilitonen, der Großmutter, einer Quietscheente, einem Kaktus, . . . 14.4.9 Vorgehen: Grenze zwischen eigenem Code/Bibliotheken verstehen • Die meisten Fehler macht man selbst :-( • Wo ist der Übergang von eigenem Code in Bibliotheken? Was passiert an der Stelle? – Hier helfen debugger; siehe unten 14.4.10 Vorgehen: Annahmen sicherstellen (Assertions) • Sie denken, Ihre Annahmen stimmen? • Dann können Sie ja Test-Code einfügen, der das überprüft • Einfache Möglichkeit: Assertions – Schlüsselwort: assert(boolescher Ausdruck) – Wenn Ausdruck wahr; weiter – Wenn falsch, Exception • Kann sehr schnell Fehler eingrenzen; insbesondere – An Grenze zu Bibliothekscode: Vor und nach Aufruf – In eigenem Code: Zu Beginn jeder Methode (haben alle Parameter den erwarteten Wert?) 14.4.11 Vorgehen: Das Wissen der Alten • Chancen stehen gut, dass man nicht der erste mit dem Problem ist – Suchmaschine! – StackOverflow! * I wrote this program for my assignment and it doesn’t work. – (Richtiges Füttern von Suchmaschinen wird eine Kernkompetenz werden. . . ) Abbildung 14.4: Wissen der Alten 14.4.12 Vorgehen: Fixes • Der Fehler ist gefunden • Die Lösung ist offensichtlich – Nur leider falsch. . . 9 10 Liste von Definitionen u.ä. • Mindestens: Die Testfälle wieder ausprobieren! – Und noch mehr Tests 14.4.13 Vorgehen: Erfahrung Debugging ist erlernt • und braucht Übung • Noch viel mehr Übung als Programmieren 14.4.14 Ansätze: Was kann man tun? Mit geeignetem Debugger: • Programmablauf gezielt unterbrechen – Programmzeile, Modul, Funktion – Beim Entstehen einer Exception • Was sind Variablenwerte an kritischen Stellen? – Variablen modifizieren? • Programm kontrolliert ausführen? – In einzelnen Schritten? – Bis zum nächsten Fehler? – Zusätzliche Funktionen ausführen? – Ablauf modifizieren? Monkey patching? 14.4.15 Debugger für Python Eigenständig • pdb: Eingebaut in Python selbst (Standard-Package) • ipdb: Ähnlich zu pdb, aber bessere Shell • pudb: Übersichtlich ohne GUI! Terminal/curses-basiert; schnelle Tastaturbasierte Navigation • Netter Überblick in einem Blog In Editoren/IDE integriert Praktisch alle der oben genannten Editoren/IDEs können einen/mehrere dieser Debugger integrieren und ansteuern – YMMV 14.4.16 14.5 Good debuggers help Testen 14.5. Testen 11 Abbildung 14.5: Good debuggers help 14.5.1 Testfälle • Schon zur Fehlersuche besprochen: Überlegen Sie geeignete Testfälle für ein Programm/Funktion/Klasse – Übliche Eingaben – Randfälle: Leere Eingaben, Sonderfälle, fehlerhafte Eingaben, . . . • Dokumentieren Sie Testfälle! 14.5.2 Automatisiert testen • Von Hand testen: nützlich, aber beschränkt – Menschen sind einfach zu faul dazu • Automatisiert testen! – Testfälle in einem Testprogramm festlegen – Bei Änderungen am entwickelten Programm: Tests laufen lassen • Das kennen Sie von den Hausaufgaben! – Punkte werden durch ein solches automatisiertes Test-Framework bestimmt 14.5.3 Test-driven design Professioneller Ansatz: • Erst die Tests schreiben – Die scheitern am Anfang natürlich alle • Nach und nach Funktion implementieren – Immer mehr Tests werden erfolgreich sein • Programm ist fertig, wenn Tests ok 14.6 Zusammenfassung 12 Liste von Definitionen u.ä. 14.6.1 Zusammenfassung • Python: Installation des Interpreters und der Standard-Bibliothek meist nicht schwer • Für produktives Arbeiten – Editoren mit Sprachunterstützung – Debugger und Debugging-Disziplin – Test-Frameworks und Test-Disziplin