ipython
– eine Python-Entwicklungsumgebung¶
Ipython ist ein Interpreter-Frontend, das vielerlei nützliche Features zum interaktiven Entwickeln von Python-Projekten bietet. Er kann durch das gleichnamige Paket installiert werden:
sudo aptitude install ipython3 ipython3-qtconsole ipython3-notebook
Die beiden letzten Pakete ermöglichen es, Ipython mit einer graphischen
Oberfläche oder als Anwendung in einem Webbrowser zu starten. Nach der
Installation kann das Programm in einer Shell mittels ipython3
oder als
graphische Oberfläche mittels ipython3 qtconsole
aufgerufen werden.
Gibt man in Ipython einen Python-Ausdruck ein und drückt Enter
, so wird
dieser ausgewertet. Besteht der Ausdruck beispielsweise aus einem einzelnen
Variablennamen, so wird eine String-Version dieser Variablen ausgegeben.
magic
-Funktionen¶
In Ipython ist es möglich, einige zusätzliche Funktionen aufzurufen; diese nur
in Ipython-Sitzungen definierten Funktionen werden als magic
-Funktionen
bezeichnet und mit %
bzw. %%
eingeleitet. Mittels %lsmagic
werden
beispielsweise alle derartigen Funktionen aufgelistet:
%lsmagic
# Ergebnis:
# Available line magics:
# %alias %alias_magic %autocall %autoindent %automagic %bookmark %cd
# %colors %config %cpaste %debug %dhist %dirs %doctest_mode %ed %edit
# %env %gui %hist %history %install_default_config %install_ext
# %install_profiles %killbgscripts %load %load_ext %loadpy %logoff
# %logon %logstart %logstate %logstop %lsmagic %macro %magic
# %matplotlib %notebook %page %paste %pastebin %pdb %pdef %pdoc %pfile
# %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch
# %psource %pushd %pwd %pycat %pylab %quickref %recall %rehashx
# %reload_ext %rep %rerun %reset %reset_selective %run %save %sc
# %store %sx %system %tb %time %timeit %unalias %unload_ext %who
# %who_ls %whos %xdel %xmode
# Available cell magics:
# %%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript
# %%latex %%perl %%prun %%pypy %%python %%python3 %%ruby %%script %%sh
# %%svg %%sx %%system %%time %%timeit %%writefile
Im folgenden werden einige der magic
-Funktionen kurz vorgestellt.
Magic-Funktionen automatisch erkennen
Durch eine Eingabe von %automagic
im Ipython-Interpreter werden im Verlauf
der Sitzung die Namen der Magic-Funktionen in den globalen Namensraum
aufgenommen. Im folgenden kann damit wahlweise pwd
oder %pwd
eingegeben werden, um den Namen des aktuellen Arbeitsverzeichnisses anzuzeigen;
das beziehungsweise die %
-Zeichen können anschließend also weggelassen werden.
Wissenschaftliche Notation von Zahlen
Mittels der %precicion
-Anweisung kann eingestellt werden, in welchem Format
Zahlenergebnisse im Ipython-Interpreter ausgegeben werden sollen. Persönlich
empfinde ich folgende Einstellung als angenehm:
%precision %.4g
Mit dieser Einstellung erhält man Ergebnisse mit wissenschaftlicher „e-Notation“
dargestellt, wobei maximal drei Nachkommastellen ausgegeben werden;
beispielsweise liefert auf diese Weise die Eingabe 5/100000000000000000000
das Ergebnis 5e-20
.
Zeilen und Zellen
Ipython kennt – ebenso wie der Standard-Python-Interpreter – zwei Arten von Anweisungen: Zum einen „simple“ einzeilige Anweisungen, zum anderen „zusammengesetzte“ Anweisungen, die aus mehreren Zeilen bestehen. In Ipython wird eine solche Block-Anweisung, die stets mit einer leeren Zeile endet, auch als „Zelle“ bezeichnet.
Die line magic
-Funktionen beziehen sich auf eine einzelne, einzeilige
Anweisung; den cell magic
-Funktionen werden hingegen der jeweiligen
Anweisung weitere Zeilen angefügt. Beispielsweise kann mittels %% writefile
dateiname
der unmittelbar folgenden Text (ohne Anführungszeichen!) in eine
Datei geschrieben werden, bis die Eingabe durch ein zweimaliges Drücken von
Enter
beendet wird.
%%writefile test.txt
Hallo
Welt!
#Ergebnis: Writing tmp.txt
Mittels %%writefile -a
wird der folgende Text an die angegebene Datei
angehängt; eine Eingabe von leeren Zeilen oder von formatiertem Text ist so
allerdings nicht möglich, die unmittelbar folgende Texteingabe wird „as it is“
geschrieben.
Code via Copy-und-Paste einfügen
Versucht man einen ganzen Code-Block per Copy-und-Paste einzufügen, so kann es zu einer Fehlermeldung kommen, wenn der Block leere Zeilen enthält: Ipython sieht an dieser Stelle die Eingabe der „Zelle“ als beendet an und beginnt die nächste (die dann meist eine falsche Einrückung aufweist).
Um dieses Problem zu umgehen, kann man die Magic-Funktion %cpaste
aufrufen:
Anschließend wird der gesamte (beispielsweise mittels Paste
) eingefügte Text
als eine einzige Eingabe-Zelle interpretiert – bis Ctrl d
gedrückt wird,
oder eine Textzeile eingegeben wird, die lediglich die Zeichenkette --
enthält.
Auf diese Weise kann man beispielsweise Vim mit dem Plugin Vicle als Editor verwenden und von dort aus Code an einen Ipython-Shell-Interpreter senden.
Python-Skripte aufrufen
Python-Skripte lassen sich folgendermaßen vom Ipython-Interpreter aus aufrufen:
%run path/script.py [arguments]
Befindet man sich bereits im Pfad der Programmdatei oder wechselt mittels
os.chdir(path)
dorthin, so kann die Pfadangabe im obigen Aufruf weggelassen
werden.
Der obige Aufruf entspricht dem üblichen Aufruf von python3 path/script.py
in einer Shell. Benötigt das Skript gegebenenfalls weitere Argumente, so können
diese im Anschluss an die Pfadangabe des Skripts angegeben werden. Ist das
aufgerufene Skript fehlerhaft und/oder benötigt es zu lange zur Ausführung, so
kann es mit Ctrl c
unterbrochen werden (KeyboardInterrupt).
Ein Vorteil der %run
-Anweisung liegt darin, dass alle im aufgerufenen Skript
definierten Variablen und Funktionen importiert und anschließend in der
interaktiven Sitzung genutzt werden können (als wären sie direkt eingeben
worden). Ein weiterer Vorteil liegt darin, dass beim Aufruf von run
zusätzliche Optionen angegeben werden können:
Mit
%run -t
(„timer“) wird die Laufzeit des Python-Skript in Kurzform dargestellt.Der Timer listet auf, wie viel Zeit beim Ausführen des Skripts für System-Aufrufe, wie viel auf benutzerspezifische Rechenschritte und wie viel Gesamt benötigt wurde.
Mit
%run -t
(„profiler“) wird die Laufzeit der einzelnen im Python-Skript aufgerufenen Anweisungen detailliert dargestellt.Der Profiler listet dabei auf, wie häufig eine Funktion aufgerufen wurde und wie viel Zeit dabei je Ausführung beziehungsweise insgesamt benötigt wurde.
Mit
%run -d
(„debugger“) wird das Programm im Python-Debuggerpdb
gestartet.Der Debugger durchläuft das Programm Anweisung für Anweisung und hält dabei an vorgegebenen Breakpoints oder bei nicht abgefangenen Exceptions; man kann sich dann beispielsweise die Werte von Variablen anzeigen lassen, die für den auftretenden Fehler verantwortlich sein können.
Debugging
Anstelle ein Python-Skript mittels %run -d script.py
von Anfang an im
Debugger zu starten, kann man in Ipython mittels %debug
einen allgemeinen
Debug-Modus aktivieren. In diesem Fall wird der Debugger automatisch gestartet,
wenn eine nicht abgefangene Exception auftritt.
Interaktion mit der Shell
Im Ipython-Interpreter lassen sich Shell-Anweisungen ausführen, indem man diesen
ein !
voranstellt; beispielsweise listet !ls
den Inhalt des aktuellen
Verzeichnisses auf. Gibt man files = !ls
ein, so wird die Ausgabe der
Shell-Anweisung ls
als Liste in der Python-Variablen files
gespeichert.
Umgekehrt kann man den Inhalt von Python-Variablen an die Shell-Anweisung
übergeben, indem man der Variablen ein $
-Zeichen voranstellt. Man könnte
also !echo "$files
eingeben, um die in der Variablen files
gespeicherten
Inhalte mittels echo auszugeben.
Konfigurationen¶
Eigene Konfigurationen lassen sich in Ipython mittels so genannter „Profile“ festlegen. Auf diese Weise kann beispielsweise festgelegt werden, welche Module beim Start von Ipython automatisch geladen oder welche Variablen standardmäßig definiert werden sollen; die Ipython-Profile ermöglichen darüber hinaus weitere Möglichkeiten, das Aussehen und Verhalten des Interpreters zu steuern.
Ein neues Profil kann folgendermaßen erstellt werden:
# Profil "default" erstellen:
ipython3 profile create
# Profil "profilname" erstellen:
ipython3 profile create profilname
Hierdurch wird das Profil mit dem angegebenen Namen im Verzeichnis
~/.ipython
neu angelegt; lässt man den Profilnamen weg, so wird das Profil
automatisch default
genannt. Bei künftigen Sitzungen wird, sofern vorhanden,
das Profil default
automatisch geladen, außer man wählt startet Ipython
explizit mit dem angegebenen Profilnamen:
# Ipython mit "default"-Profil starten:
ipython3
# Ipython mit "profilname"-Profil starten:
ipython3 --profile=profilname
Durch das Erstellen eines Profils wird im Verzeichnis
~/.ipython/profile_default
(oder einem entsprechenden Profilnamen)
automatisch ein Satz Konfigurationsdateien erstellt. Die wichtigsten
Konfigurationsdateien sind:
ipython_qtconsole_config.py
: Diese Datei wird aufgerufen, wenn Ipython mittelsipython3 qtconsole
, also mit graphischer QT-Console gestartet wird.ipython_notebook_config.py
: Diese Datei wird aufgerufen, wenn Ipython mittelsipython3 notebook
, also als Webanwendung gestartet wird.ipython_config.py
: Diese Datei wird immer aufgerufen, wenn Ipython mit dem angegebenen Profil gestartet wird.
Alle Konfigurationen enthalten sämtliche Einstellungsoptionen mitsamt der zugehörigen Beschreibungen in Kommentarform; um eine Einstellung vorzunehmen, muss also nur das Kommentarzeichen am Anfange der jeweiligen Zeile entfernt und der Konfig-Variable der gewünschte Wert zugewiesen werden.
Abgesehen von vielen zusätzlichen Kommentaren kann eine Konfigurationsdatei somit beispielsweise folgendermaßen aussehen:
# sample ipython_config.py
# Configuration file for ipython.
c = get_config()
# lines of code to run at IPython startup.
c.InteractiveShellApp.exec_lines = [
'import math as m',
'import numpy as np',
'import matplotlib as mpl',
'import matplotlib.pyplot as plt',
'import sympy as sy',
'import pandas as pd',
'pi = m.pi',
'sq = m.sqrt',
'sin = m.sin',
'cos = m.cos',
'tan = m.tan',
'atan = m.atan',
'rad = m.radians',
'deg = m.degrees',
'g = 9.81',
'%precision %.4g',
]
# Autoindent IPython code entered interactively.
c.InteractiveShell.autoindent = True
# Enable magic commands to be called without the leading %.
c.TerminalInteractiveShell.automagic = True
c.TerminalInteractiveShell.history_length = 10000
# Set the color scheme (NoColor, Linux, or LightBG).
c.TerminalInteractiveShell.colors = 'Linux'
c.TerminalInteractiveShell.color_info = True
Die einzelnen Optionen können bei Bedarf auch innerhalb einer laufenden Sitzung
geändert werden; hierzu muss man lediglich eine Anweisung der Form %config
InteractiveShell.autoindent = True
eingeben.
Weitere Infos zu Ipython gibt es in der offiziellen Dokumentation (en.).