Profiter du notebook de IPython 23


IPython est un des outils qui me font trouver la programmation Python plus agréable que dans tous les autres langages : un shell avec tellement d’astuces intégrées que ça donne envie de vomir des arc-en-ciel.

Aujourd’hui je vais vous parler d’une fonctionnalité fantastique est très peu connue de IPython : le notebook.

Si vous êtes scientifique ou manipulez pas mal de graphiques et de données numériques, c’est un must have. Mais personnellement je trouve que c’est aussi un fantastique outil d’éducation, c’est génial pour les cours, les démos, et expérimenter avec du code inconnu.

Ça se présente sous la forme d’un shell IPython intégré dans une page Web, mais que l’on peut avoir sur son desktop, pas besoin d’avoir un serveur distant. Si vous avez un peu de temps, voici une vidéo de démo (avec un musique horrible) :

L’installation sous Ubuntu, c’est juste :

sudo apt-get install ipython-notebook

Pour Windows, il me semble, de mémoire, que c’est intégré dans l’exe. Pour Mac, je ne sais pas.

Et derrière il suffit de lancer la commande :

ipython notebook

Et il va vous ouvrir votre navigateur avec un onglet sur votre notebook.

L’intérêt principal du notebook est que TOUT le code est coloré et est modifiable comme sur dans fichier mais TOUT le code est exécutable (et affiche son résultat juste après chaque ligne) comme dans un shell iPython, avec completion du code. Le meilleur des deux mondes quoi.

En prime on peut embeder du markdown (et donc des liens, des images, etc) dans le même notebook, sauvegarder ça pour plus tard, le partager, etc.

Personnellement, j’ai ceci dans mon .bashrc :

notebook () {
    processes=$(ps aux | grep -i -P "ipython notebook" | wc -l)
    if [[ $processes -lt 2 ]]
    then
        pushd /tmp
        nohup ipython notebook --port 8889 $1 &
        popd
    else
        firefox http://127.0.0.1:8889
    fi
}

Comme ça en une commande je lance le serveur du notebook sur le port que je veux si il ne tourne pas, et si il tourne, j’ouvre firefox et ouvre un onglet dessus.

Quelques autres options très utiles :

–pylab : Charger plein de libs pour transformer IPython en un matlab killer.
–gui=lib : permet d’intégrer l’event loop de QT, wx, gtk, etc.
–ip=0.0.0.0 : si on veut que d’autres puisse accéder à notre notebook.

Il existe un espèce de pastebin spécialement fait pour le notebook, qui permet de partager ses expérimentations.

23 thoughts on “Profiter du notebook de IPython

  • Matthias

    Merci pour ce petit article sur IPython, c’est agréable d’avoir un peu de resources en français
    Juste quelque remarques cependant.

    IPython avec un I majuscule (d’ailleurs le titre de cet article est I Maj, P min…) .
    %pylab (dans la premiere cellule est) préferable à –pylab car on peut pas dé-pylab-er.

    IPython marche aussi en Ruby: http://nbviewer.ipython.org/urls/raw.github.com/minad/iruby/master/IRuby-Example.ipynb

    en Julia
    http://nbviewer.ipython.org/url/jdj.mit.edu/~stevenj/IJulia%2520Preview.ipynb

    Scala
    https://github.com/mattpap/IScala

    et Haskell
    https://github.com/gibiansky/IHaskell

  • kontre

    Punaise, il a fait du chemin le langage Julia. maintenant il peut même importer les modules python. Je vais suivre ça de près !

  • beastie

    Merci pour cet article.
    Une remarque qui n’as pas grand chose à voir avec ipython/python.
    En shell script, il faut éviter les “ps aux | grep”. Ce type de chaines de commandes est susceptible à une floppée de race conditions (d’où le test un peu curieux où on s’attends à avoir deux processus apparaitre).

    A moins d’être coincé sur un vieux UNIX d’entant, il vaut mieux utiliser pgrep.
    Par exemple, pgrep -f “ipython notebook”
    Plus d’informations sont disponibles sur ce wiki: http://mywiki.wooledge.org/BashPitfalls#ps_ax_.7C_grep_gedit

    (en fait c’est pas tellement vrai, mais il y a plein de choses qui sont bonnes à savoir si on fait du bash et qu’on veut éviter les pièges usuels, donc je le link :-) )

  • Matthias

    > y-a t’il moyen de taper depuis vim et d’avoir le rendu à coté ?

    Techniquement oui. vim-ipython se connecte a IPython kernel, et le kernel publie ses resultats sur un Socket ZMQ qui broadcast. Les clients actuels sont codé pour ignorer les réponses aux requêtes qu’ils n’ont pas initiés. Il “suffirait” juste de faire un client qui affiche tout ce qu’il voit passer, mais en pratique ça intéresse personne donc personne ne l’as codé.

  • Josh

    Bon, ça fait un moment que je suis ce blog — sans commenter parce que je suis un flemmard — mais comme j’ai une question, c’est aussi une bonne occaz’ pour vous remercier des posts que vous faites, c’est hyper intéressants, j’ai appris une tonne de trucs (mais y’a encore un max de trucs que je ne comprends pas).

    Et là, le note-book pour moi qui fait de la recherche, c’est LE truc de ouf. Bon, du coup je me suis mis un peu plus sérieusement à Ipython, et j’ai essayé de configurer, en suivant vos autres articles sur le sujet. Et je suis tombé sur un os avec sublime text 2 (que j’utilise grace à vous également) en voulant l’utiliser avec %edit, j’obtiens à chaque fois un truc du genre:
    WARNING: Could not open file for safe execution.WARNING: File not found. Did you forget to save?

    et ce, avant meme d’avoir pu fermer le fichier qu’il m’ouvre sous sublime. Une idée ?

    En passant, un truc intéressant : j’ai installé le note-book avant de générer le fichier de config pour ipython, et j’ai remarqué que du coup il en a généré deux, le deuxième (ipython_notebook_config.py) étant manifestement lié au note-book seul…

  • Sam Post author

    Oula man, pour un truc aussi précis vaut mieux aller sur un forum, un stackoverflow like ou carrément sur le issue tracker de ipython. Le blog c’est vraiment pas un outil pour dépanner.

  • Matthias

    @Josh

    %edit doit surement attendre que la commande qui appel l’éditeur de text soit bloquante, ce que sublime ne dois pas être par default.
    essaye d’ajouter l’option -w (Wait for the files to be closed before returning)
    http://www.sublimetext.com/docs/2/osx_command_line.html
    C’est une limitation très difficile a contournée si l’éditeur n’as ni wait options, ni plugin qui s’adresse directement au kernel IPython.

    Sinon oui, il y a plusieurs fichiers de config 1 global + 1 par frontend, ce qui permet d’avoir des options différentes.

    On peut discuter de ça sur IPython-dev(at)scipy.org il y a pas mal de français dessus si l’anglais te fait peur.

  • Josh

    @Sam: bah, c’était surtout un prétexte pour faire un coucou ^^.
    @Matthias: bien joué, un “-w” a réglé le problème. Merci!

    En passant, une info qui peut etre intéressante pour d’autres: apparemment, pour faire des imports au démarrage dans le notebook, le fichier de config de ipython ne suffit pas, et celui de notebook n’a pas cette option. D’après une discussion sur le forum d’aide de notebook, il faut faire un script dans startup/.

  • Matthias

    > apparemment, pour faire des imports au démarrage dans le notebook, le fichier de config de ipython ne suffit pas, et celui de notebook n’a pas cette option.

    Vraiment ?… pour être familier avec le fonctionnement interne, ca ne devrais pas être le cas.
    Vu que tous les fichiers de config sont éxécutés dans un meme namespace.
    (Ce n’est pas parceque l’option apparait pas commentée qu’elle existe pas.)
    Ce que Min a répondu sur hipchat était la solution de facilité je pense. Je vais vérifier.

    > D’après une discussion sur le forum d’aide de notebook, il faut faire un script dans startup/.

    Il y a une legère différence entre les deux (si je me souviens bien) dans certains cas comme `from __future__ import …` qui marche dans l’un et pas dans l’autre.

  • Matthias

    je confirme
    `c.InteractiveShellApp.exec_lines = [‘yes=False’,’import pandas as ppp’]`
    fait bien ce qu’on pense si mis dans `ipython_notebook_config.py`

    Sur la dev-version, on peut meme faire `c.InteractiveShellApp.exec_lines.extend([‘yes=False’,’import pandas as ppp’]`) et ça concatene avec les valeurs définies dans `ipython_config.py`..mais je m’égare.

  • Josh

    Au temps pour moi, j’aurais du tester l’option direct. Et d’ailleurs je m’attendais à un comportement comme celui de la dev-version.

  • Sam Post author

    @Josh bon bah je vais utiliser ton message d’erreur pour faire l’article du jour, comme ça si quelqu’un d’autre se pose la question, il aura la réponse cash pistache.

Leave a comment

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.