= 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]: }}} 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]: }}} == 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/ in () NameError: name 'totalermist' is not defined > (1)() 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 hashlib module 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)() -> print 4 }}}