Jupyter, le couteau suisse des interprétateurs interactifs

Linux Pratique n° 092 | novembre 2015 | Adalbert Arsen
Creative Commons
  • Actuellement 0 sur 5 étoiles
0
Merci d'avoir participé !
Vous avez déjà noté cette page, vous ne pouvez la noter qu'une fois !
Votre note a été changée, merci de votre participation !
Boostez votre productivité en transformant votre navigateur web en interpréteur interactif, et combinez un ou plusieurs langages de programmation de votre choix !

1. Jupyter Notebook App

Il y a presque 4 ans jour pour jour, le projet Notebook a fait son entrée avec la version 0.12 de IPython. Il a depuis bénéficié de nombreuses améliorations et a gagné en popularité. La dernière version IPython 4.0 met fin au Notebook dans sa forme actuelle et marque le début d’un nouveau projet appelé Jupyter. Le projet Jupyter, tout comme son prédécesseur, propose une application web qui permet aux utilisateurs d’interagir avec le code et de transformer le navigateur web en terminal interactif et en logiciel de traitement de texte en même temps. En plus de pouvoir développer, il est désormais possible de le documenter avec du texte enrichi (Markdown, HTML/CSS) des citations Bibtex, équations LaTex, des images et des vidéos. Si vous avez un blog ou que vous préparez un compte-rendu, vous pouvez exporter vos documents dans des formats tels que : PDF, LaTeX, RST, HTML et même en diapositives. Fait marquant – Jupyter n’est plus associé au IPython. Parmi les nombreux projets « satellites » de Jupyter, vous trouverez aussi plus de 50 langages différents !

1.1 Installation

En fonction de votre configuration et de vos permissions, il sera parfois nécessaire de précéder avec sudo les commandes mentionnées. Tous les codes présentés dans cet article ont été testés sur une installation « fraîche » de Ubuntu 14.04.03 LTS qui est fournie avec Python 2.7 et Python 3.4. Si vous utilisez déjà IPython Notebook, vous trouverez des informations utiles à propos de la migration sur le site : http://jupyter.readthedocs.org.

Installation Jupyter Notebook pour Python 3.x avec dépendances :

apt-get install python3-pip python3-zmq python3-dev

pip3 install jupyter

Installation Jupyter Notebook pour Python 2.x avec dépendances :

apt-get install python-pip python-zmq python-dev

pip install jupyter

Si comme moi vous installez Jupyter avec les kernels Python 2.x et 3.x en même temps, assurez-vous que les deux noyaux Python sont disponibles dans Jupyter. L'ancienne syntaxe marche toujours :

ipython2 kernelspec install-self --user

ipython3 kernelspec install-self --user

puis vérifiez la liste des noyaux disponibles ainsi que votre version de IPython :

jupyter kernelspec list

ipython3 --version

Cette dernière doit être au minimum 4.0.0. Avec une version antérieure, vous obtiendrez un message d'erreur : ImportError: No module named 'Ipython.path'. Il faut alors faire une mise à jour de IPython :

sudo pip3 install -u ipython

Pour utiliser Jupyter Notebook, vous devez posséder un des navigateurs suivants : Firefox (6 et +), Chrome (13 et +) ou Safari (5 et +). Démarrez le Notebook dans le répertoire de votre choix en tapant la commande jupyter notebook. Une fois démarré, Jupyter restera accessible dans votre navigateur sous l’adresse http://localhost:8888 ou http://127.0.0.1:8888.

Note

Attention !

Par défaut, le Notebook est disponible uniquement pour l’hôte local, mais on peut configurer et sécuriser l'accès au Notebook. Le fichier de configuration jupyter_notebook_config.py se trouve dans le dossier $HOME/.jupyter. En cas d’absence, générez-le avec la commande jupyter notebook --generate-config. La configuration du Jupyter est distincte de celle de IPython.

1.2 Premiers pas avec le Notebook

L’interface principale de Jupyter est intuitive. Dans l’onglet Files, vous pouvez accéder à la liste des fichiers .ipynb (IPython Notebook) dans votre répertoire, les créer, renommer ou supprimer. L’onglet Running permet de voir la liste des processus actifs et de les éteindre avec l’option Shutdown. Cette dernière option est utile pour arrêter ou interrompre des processus actifs qui consomment trop de ressources système. Le dernier onglet Clusters est réservé aux calculs en parallèle. Créez maintenant un nouveau Notebook via le bouton New > Python3 ou New > Python2. Dans la nouvelle fenêtre qui s’affiche, vous trouverez une barre d’outils (figure 1) permettant d’accéder aux fonctionnalités les plus courantes ainsi qu’une première cellule du terminal interactif (figure 1). Dans cette dernière, vous pouvez entrer du code comme dans un terminal. Si vous n’avez jamais utilisé le Notebook, sachez qu’une cellule interactive peut contenir aussi bien du code (Code) que du texte enrichi (Markdown) ou bien du texte brut (Raw). Ces fonctionnalités sont discutées dans la suite de l'article. Vous pouvez modifier le type de la cellule à tout moment via la barre d'outils.

Note

Attention !

Découvrez toutes les fonctionnalités du Notebook grâce à une présentation interactive intégrée. Dans le menu Help sélectionnez User interface Tour. Sélectionnez Help > Keyboard shortcuts pour connaître la liste des raccourcis clavier.

Faites maintenant un test trivial. Dans la première cellule, essayez d’entrer :

a = 2

print a

Exécutez le code en appuyant sur le bouton lecture (Figure 1) (alternative : tapez [Esc] pour sortir du mode édition de la cellule puis tapez [Shift] + [Entrer]). Si vous avez choisi Python3 comme noyau, une erreur de syntaxe devrait apparaître sur la ligne qui contient print. Rien de grave bien sûr. Placez le curseur dans la cellule en question, corrigez en ajoutant des parenthèses supplémentaires à la fonction print, puis exécutez le code à nouveau. L’erreur disparaît, le résultat 2 s'affiche. Facile, non ? Si vous avez les deux noyaux Python2 et Python3 vous pouvez aussi basculer de l'un vers l'autre via le menu Kernel > Change kernel. Si vous le faites, exécutez toutes les cellules dès le début via le menu Cell > Run all.

Figure 1 : Exemple de code avec erreur de syntaxe.

1.3 Programmation et rédaction ?

Jusqu’à présent le développement d’un code et la rédaction ne pouvaient pas être faits simultanément dans une seule interface d’utilisateur. On est habitué à ce qu’une interface en ligne de commandes comme IPython ou Matlab puisse être utilisée uniquement pour développer et corriger du code. La rédaction d’un chapitre de thèse, d’un article ou d'un compte-rendu nécessite LaTeX, LibreOffice ou Word. Pour une présentation devant un grand public, on va certainement utiliser PowerPoint, Impress ou Acrobat Reader. Avec le Notebook, il est possible de faire la rédaction tout en écrivant votre code. Il ne s’agit pas ici de simples commentaires. Grâce à la gestion du Markdown et des capacités multimédias de votre navigateur web, la gamme des possibilités est très large. Si vous avez déjà créé des documents HTML/CSS ou LaTeX, vous vous y retrouverez tout de suite.

Tout d’abord, dans un Notebook vous avez la possibilité de structurer votre texte en utilisant les balises HTML ou la syntaxe Markdown. Pour que le contenu d’une cellule interactive puisse générer du texte enrichi, changez son type Code > Markdown en utilisant la liste déroulante dans la barre d’outils (alternative : tapez [Esc] pour sortir du mode édition de la cellule puis tapez [M] pour Markdown, [Y] pour du code et [R] pour du texte brut). La Figure 2 montre un aperçu rapide des possibilités de rédaction avec la syntaxe Markdown et HTML.

  

Figure 2 : Exemple de syntaxe Markdown, Flavoured Git Markdown et HTML durant et après rédaction.

La taille et la couleur des polices peuvent être modifiées à tout moment avec les balises HTML <font></font> comme dans l'exemple ci-dessous :

<cite><font color="red">

Laurence ! Je crois que le bug il est la - entre le clavier et la chaise. Sylvain.

</font></cite>

Bien que la décoration du texte peut être faite manuellement, il est préférable de modifier l'apparence du texte en utilisant une feuille de styles CSS personnalisée. Jupyter Notebook contrairement au IPython Notebook n'utilise pas les profils. À leur place, il y a un seul répertoire de configuration. La feuille de styles custom.css doit être donc (dé)placée dans le dossier ~/.jupyter/custom.

~/.ipython/profile_default/static/custom~/.jupyter/custom

Utilisez la commande locate style.min.css et/ou locate custom.css pour retrouver et comparer vos feuilles de styles.

Astuce : utilisez des extensions comme Calicio Spell Check pour améliorer votre rédaction en anglais. Après l'installation, une case à cocher dans la barre d'outils vous permettra d'activer/désactiver la vérification de l'orthographe. Vous trouverez d'autres extensions utiles en recherchant le mot clé nbextension.

jupyter nbextension install https://bitbucket.org/ipre/calico/downloads/calico-spell-check-1.0.zip

jupyter nbextension enable calico-spell-check

Note

Attention !

Dans le Notebook, le contenu de chaque cellule est décrit à l'aide des balises (format JSON) et peut contenir du code JavaScript, ce qui représente un risque potentiel pour votre ordinateur. Le contenu d'une cellule est exécuté/rendu pleinement uniquement si le document Notebook a été créé ou authentifié par l'utilisateur avec sa propre clé de sécurité (notebook_secret). Dans le cas échéant, le contenu CSS et JavaScript non authentifié est enlevé de la cellule. Le contenu est toujours assaini (Google Caja).

1.4 Widgets, images et vidéos

Durant une réunion ou une formation, une démonstration en direct de votre code est plus intéressante que des captures d'écran. Les composants graphiques interactifs - ou widgets - constituent une catégorie à part. Pas besoin de plonger dans le Tcl/TK ou Qt, si vous avez besoin d'un bouton, d'une liste déroulante, ou d'une barre de progression, les widgets sont là pour vous aider à construire en mode ultra rapide un GUI pour votre code. Imaginons par exemple une fonction myplot() qui accepte un paramètre flottant dt et un paramètre de type string sat pour afficher un graphique. Pour construire une GUI interactive, seulement 3 lignes de codes sont nécessaires :

from ipywidgets import FloatSlider, ToggleButtons, interact

res=interact(myplot,dt=FloatSlider(min=0, max=8, step=1, value=1),

sat=ToggleButtons(description='Satellite:',

options=['Geosat', 'Topex', 'Envisat'],));

Dans l'exemple ci-dessus (figure 3), FloatSlider génère un curseur de défilement qui retourne un nombre fini des valeurs comme l'aurait fait numpy.arange ou numpy.linspace. ToggleButtons affiche trois boutons cliquables et retourne une valeur de type string. La fonction interact fait le lien entre les trois éléments. Ce code m'a permis de générer l'interface visible sur la figure 3. Dès maintenant, chaque personne qui visualise mon fichier peut non seulement l’exécuter, mais aussi étudier en direct la sensibilité des différents paramètres. Seul bémol : le rendu HTML statique des ipywidgets n'a pas été encore amélioré.

Figure 3 : Widgets, images et vidéos directement dans votre terminal interactif.

Note

Attention !

L'importation de certains modules a changé avec Jupyter Notebook.

IPython.html → notebook, IPython.html.widgets → ipywidgets,IPython.kernel → jupyter_client, ipykernel

Coté image et vidéo, la situation est encore plus simple. Seulement deux lignes de code vous permettent d’intégrer dans votre document une page ou un moteur de recherche via <Iframe>, par exemple :

from IPython.display import HTML

HTML('<IFrame src="https://fr.m.wikipedia.org/wiki/Main_Page" width=700 height=350>')

Idem pour les vidéos des services populaires :

from IPython.display import YouTubeVideo

YouTubeVideo('b9MQ4R5NrWI')

L'utilisation de ces éléments interactifs est d'autant plus intéressante vu que la plupart d'entre eux garderont leur aspect et/ou leur interactivité une fois publiés sur votre réseau ou sur le net.

1.5 Conversion et publication

L'outil nbconvert est un outil en ligne de commandes qui permet de convertir les fichiers .ipynb dans un des formats supportés entre autres : HTML, LaTeX, PDF, python (fichier .py) et slides.

jupyter nbconvert --to pdf votre_fichier.ipynb

jupyter nbconvert --to html --template base votre_fichier.ipynb

Si vous partez d'une nouvelle installation Ubuntu 14.04 pour profiter du rendu en LaTeX et PDF, vous aurez besoins des dépendances suivantes :

apt-get install inkscape pdflatex texlive-base texlive-lang-french texlive-latex-base

Pour les formats HTML et LaTeX, l'option --template permet d'appliquer un thème. Par exemple, l'option --template report permet de générer la table de matières à partir de vos balises h1 à h6 (ou # - #####). Les options --template basic et --template full utilisées avec le format HTML permettent de choisir entre une version simplifiée (sans entêtes HTML) pour les blogs/pages web et un rendu HTML statique complet. Vous avez aussi la possibilité de convertir les fichiers via le menu File > download as. Le format slides permet de générer une présentation avec diapositives animées avec JavaScript (Reveal.js). Pour convertir et activer une présentation directement dans votre navigateur, il suffit d'ajouter l'option --post serve :

jupyter nbconvert mon_fichier.ipynb --to slides

jupyter nbconvert mon_fichier.ipynb --to slides --post serve

Les diapositives générées à partir de votre fichier Notebook ont par défaut une barre de progression automatique et une interface de défilement à l'aide de flèches (droite-gauche, haut-bas) sympathique.

Note

Attention !

Une liste déroulante dans la barre d'outils Cell Toolbar > Slideshow vous permet de définir le contenu de chaque diapositive. L'option Slide Type > Slide appliquée à une cellule définit une diapositive. Les options Sub-slide et fragment permettent d'ajouter d'autres cellules à la diapositive. L'option Sub-slide incrémentera la barre de progression contrairement à l'option fragment qui fait juste apparaître des éléments suivants.

Si vous voulez partager ou visionner rapidement un fichier Notebook et vous ne souhaitez pas vous préoccuper du rendu et de l’intégration du HTML, ou simplement vous ne pouvez pas le faire, vous pouvez utiliser le service http://nbviewer.jupyter.org. Sur cette page, il suffit d'indiquer simplement l'adresse URL d'un fichier .ipynb pour récupérer après quelques instants un lien d'une version en HTML.

1.6 Jupyter, des langages à volonté

J'ai gardé le meilleur pour la fin. L'un des objectifs du projet Jupyter est la gestion de multiples langages de programmation, une cinquantaine est disponible au jour de la rédaction de cet article. Cependant, il est nécessaire de rester attentif durant leur installation, car en fonction de votre configuration vous pourrez parfois rencontrer des problèmes. Néanmoins, vous allez réussir comme moi à intégrer la plupart d’entre eux dans l’interface principale de Jupyter. Voici quelques exemples testés sur Ubuntu 14.04.

Bash

pip install bash_kernel

python -m bash_kernel.install

Comme le montre la Figure 4, votre navigateur réagit correctement aux commandes bash tout comme votre terminal.

echo "Exemple avec Bash"

a=lolo

cat /etc/passwd | grep $a

jupyter kernelspec list

Figure 4 : Test du noyau Bash.

IJavascript : Si vous avez déjà IPython 4.0, n’installez pas: ipython-notebook. Exécutez une seul fois ijs.

sudo apt-get install nodejs-legacy npm libzmq-dev

sudo npm install -g ijavascript

sudo ijs

L'installation du noyau IJavascript varie en fonction du système d’exploitation. Vérifiez Installation notes sur la page https://www.npmjs.com/package/ijavascript. En cas de besoin, installez nodejs > 0.10.

Un test très simple permet de vérifier les fonctionnalités de base (figure 5) :

/* 1ere cellule - sortie html */

$$html$$ = "<button type='button'>Click !</button>";

/* 2eme cellule – image SVG */

var msg = ["Exemple","avec","IJavascript"].join(" ")

$$async$$ = true;

console.log(msg);

setTimeout(

function() { $$svg$$ = "<svg><circle cx='30px' cy='30px' r='20px'/></svg>";

$$done$$();}, 1000 );

Figure 5 : Test du noyau IJavascript.

Scilab

sudo apt-get install scilab

sudo pip3 install scilab2py

git clone https://github.com/blink1073/scilab_kernel.git

cd scilab_kernel

sudo python3 setup.py build

sudo python3 setup.py install

Octave

sudo apt-get install octave

pip3 install octave_kernel

Comme dans les versions précédentes du Notebook, vous avez la possibilité d'utiliser dans votre document n’importe quel langage grâce à la fonction magique %%script à condition bien sûr, que ce langage soit déjà installé sur votre machine. Par exemple, j'ai pu tester dans cinq cellules consécutives l’exécution des scripts JavaScript, PHP, HTML et Julia (figure 6).

%%script php

<?php echo "Linux Pratique numéro ".strval(80+12);?>

 

%%html

<p id="st">Linux Pratique numéro 92</p>

 

%%javascript // agit sur l'élément <p> id="syl" (Figure 2)

element = document.getElementById("numero")

element.style.color = 'blue'

On remarque que la couleur de la police du paragraphe id="st" a changé (noir → bleue)

%%script julia

function x2x(x::Int)

res = x ^ x

end

println("résultat= ",x2x(2))

Si vous utilisez un langage compilé comme Fortran, vous pouvez installer une extension fortranmagic à l'aide des fonction magiques %install_ext et %load.

%install_ext https://raw.github.com/mgaitan/fortran_magic/master/fortranmagic.py

%load_ext fortranmagic

La fonction saisie (ici x2y) sera enregistrée dans un fichier fortran que vous retrouverez dans le répertoire $HOME/.cache/ipython/fortran/, ensuite ce fichier est compilé :

%%fortran

subroutine x2y(x,y,z)

real, intent(in) :: x,y

real, intent(out) :: z

z = x**y

end subroutine x2y

Grâce au module f2py, lors de l'appel à la fonction, le résultat est retourné sous Notebook (figure 6).

a = x2y(2,4) # appel à x2y sous Python

print(a)

Finalement, un test d'une fonction similaire avec Julia :

%%script julia

function x2x(x::Int)

res = x ^ x

end

println("résultat= ",x2x(2))

Figure 6 : Test d’exécution avec %%script.

Conclusion

Grâce à sa polyvalence, le projet Jupyter constitue un superbe outil de travail et d’apprentissage. Mais comme chaque projet de cette ampleur, Jupyter a ces petits défauts. On constate surtout un certain nombre de problèmes durant l'installation des noyaux. On constate aussi un manque, parfois cruel, de documentation compréhensible pour les nouveaux utilisateurs. On apprécie par contre les efforts apportés par la communauté dans le développement du projet Jupyter et des projets « satellites ». Plusieurs projets visant le déploiement et le travail collaboratif sont déjà disponibles. Il s’agit de Jupyter Hub, Jupyter Drive et nbgrader. Tous les trois risquent d’intéresser les professionnels de la formation et les petites entreprises. Ce qu'on peut souhaiter voir dans le futur : une extension pour corriger l’orthographe française, le développement de la représentation statique HTML des widgets et surtout un outil d'édition des thèmes qui devrait apparaître avec les prochaines versions de Jupyter.

Références

La page du projet Jupyter : https://jupyter.org

Installation LaTex pour Ubuntu : http://doc.ubuntu-fr.org/latex

La doc : http://jupyter.readthedocs.org

Installation nodejs : https://github.com/nodesource/distributions

Tags : Python