Ipython
Ipython ist eine erweiterte interaktive Python Shell.
Warum verwenden
Ipython ist sehr stabil, hat Autocomplete, kann eigentlich alles was die normale Python shell auch kann und hat ein paar nette Erweiterungen eingebaut. Es ist außerdem sehr einfach Ipython mit eigenen Funktionen zu erweitern.
Installation
mit pip
pip install ipython
oder für Debian/Ubuntu Linux heads
aptitude install ipython
autocomplete
Autocomplete mit der Tabulatortaste hilft beim inspizieren von Modulen/Klassen, auch für neu importierte und eigene geschriebene Module.
In [9]: django.__r django.__reduce__ django.__reduce_ex__ django.__repr__
Systembefehle
Ipython kann Systemaufrufe wie ls, date oder find direkt in der Shell erledigen.
um das aktuelle Datum auszugeben mit dem Befehl date wird ein Rufzeichen vorangestellt.
In [1]: !date Mon Aug 22 13:02:36 CEST 2011
will man die Ausgabe weiterverarbeiten kann man 2 Rufzeichen verwenden. Danach wird der Inhalt der Ausgabe in eine Liste gespeichert.
In [2]: !!ls *.py Out[2]: SList (.p, .n, .l, .s, .grep(), .fields(), sort() available): 0: __init__.py 1: fabfile.py 2: foo.py 3: manage.py 4: settings.py 5: urls.py
Die Liste kann mit der Zeilennummer und einen Unterstrich bei Out angesprochen werden.
In [3]: print _2 ['__init__.py', 'fabfile.py', 'foo.py', 'manage.py', 'settings.py', 'urls.py']
editieren %edit
Mit %edit kann ein Editor (meistens vim, kann aber auch anderer eingestellt werden) aus Ipython heraus gestartet werden. Schließt man diesen wieder wird der Inhalt in die Ipython Session geschrieben. So ist es auch möglich eine bereits geschriebene Funktion mit %edit meinefunktion zu editieren.
speichern %save
Man kann beliebige Teile einer Session mit %save speichern. Dazu muss man die Zeilennummern von bis angeben.
In [4]: %save meines 1-3 The following commands were written to file `meines.py`:
würde von Zeile 1 bis 3 den Code in die Datei meines.py speichern.
einfügen %paste
Mit %paste wird aus der Zwischenablage Text/Code eingefügt.
%pastebin
Mit pastebin kann zeilenweise der Code an den Pastebin-Dienst von den pocoo Jungs gepastet werden.
Hier wird alles von Zeile 1 bis Zeile 3 gepastet und die URL zurückgegeben.
In [4]: %pastebin 1-3 Out[4]: 'http://paste.pocoo.org/show/461918'
eigene Funktionen für Ipython schreiben
Hier ist eine kleine Funktion die das SQL Logging in Django aktivieren soll, damit man den rohen SQL Query sieht.
Zuerst wird eine Datei erstellt im ~/.ipython/ Ordner
# ~/.ipython/ipy_django.py def django_sql_logger(): import logging l = logging.getLogger('django.db.backends') l.setLevel(logging.DEBUG) l.addHandler(logging.StreamHandler())
dann noch in die Datei schreiben was geladen werden soll beim Start von Ipython.
# ~/.ipython/ipy_user_conf.py execf('~/.ipython/ip_django.py')
und schon beim nächsten Start hat man Ipython um die Funktion django_sql_logger erweitert.
vorher:
In [4]: Log.objects.all()[0] Out[4]: <Log: 2011-06-19 00:00:00 I am interested as t>
nachher:
In [5]: django_sql_logger() In [6]: Log.objects.all()[0] (0.001) SELECT `irclogger_log`.`id`, `irclogger_log`.`user`, `irclogger_log`.`msg`, `irclogger_log`.`channel`, `irclogger_log`.`pub_date` FROM `irclogger_log` LIMIT 1; args=() Out[6]: <Log: 2011-06-19 00:00:00 I am interested as t>
debugger %pdb
Man kann Ipython so einstellen, dass sobald ein Fehler aufgetretten ist sich eine pdb Session öffnet.
In [5]: %pdb Automatic pdb calling has been turned ON In [6]: totalermist() --------------------------------------------------------------------------- NameError Traceback (most recent call last) /home/bee/ws/django-irc-logs/<ipython console> in <module>() NameError: name 'totalermist' is not defined > <ipython console>(1)<module>() ipdb>
Was ist nun eigentlich alles importiert?
Bei längeren Sessions kann es passieren, dass man leicht den Überblick verliert, welche Module importiert worden sind und welche Funktionen bereits angelegt wurden. Da hilft %who und %whos (mehr Details).
In [6]: %who get_version hashlib In [7]: %whos Variable Type Data/Info ----------------------------------- get_version function <function get_version at 0x7fb94cd76320> hashlib module <module 'hashlib' from '/<...>b/python2.6/hashlib.pyc'>
pylab (mathlab) Integration
wenn man Ipython mit -pylab startet hat man direkt Zugriff auf alle pylab Pakete. Es wird auch sofort automatisch geplottet.
ein einfaches Fake-Histogram
hist(randn(1000)m 100)
externe Pythondateien ausführen
Mit run kann jede beliebige Python Datei in der Session ausgeführt werden.
In [7]: run foo.py > /home/bee/ws/django-irc-logs/foo.py(5)<module>() -> print 4