PyUGAT

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

PyUGAT: ipython (last edited 2011-09-02 13:03:10 by bessl)