Le shell Python est vraiment pratique pour expérimenter, apprendre le langage, tester un snippet vitos ou administrer son site à distance. Mais iPython, ola, iPython, il déchire sa génitrice avec une poutrelle en verre pilé.
Voici quelques commandes qui vous donneront moult raisons de plus pour très vite installer ce shell alternatif.
Autocall
Taper des parenthèses et des guillemets, c’est sooooooo 1995. iPython peut vous les rajouter automatiquement dans les appels de fonctions, il faut juste préfixer de “/”, “,” ou “;” votre appel de fonction pour qu’il fasse la conversion:
/f 1,2 => f(1,2) ,f 1 2 => f("1","2") ;f 1 2 => f("1 2") |
Accès au shell système
Préfixez votre commande d’un “!” bien couillu, et iPython va vous exécuter ça dans le shell système (par exemple bash) et vous retourner le résulat:
>>> ! cat /etc/fstab | grep 'ext4' UUID=e33c5b98-1570-44d6-a32f-5e7970e1e588 / ext4 errors=remount-ro 0 1 |
Oui, oui, on est dans un shell Python là. Ou comment bien faire chier la coloration syntaxique de votre blog.
Et on peut mettre tout ça dans une variable et le traiter en Python derrière:
>>> files = !ls >>> [f.upper() for f in files] ['BUREAU', 'DOCUMENTS', 'EXAMPLES.DESKTOP', 'IMAGES', 'MOD\xc3\xa8LES', 'MUSIQUE', 'PUBLIC', 'T\xc3\xa9L\xc3\xa9CHARGEMENTS', 'UBUNTU ONE', 'VID\xc3\xa9OS',] |
A noter que tout est exécuté dans un autre process, ainsi !cd
n’aura aucun effet. Mais tout est prévu: %cd
et %pwd
proxient tout ça vers os.chdir
et os.getcwd
:-)
Debugger
Entrez %timeit
expression pour qu’il qu’iPython vous l’exécute 10000000 fois et vous donne sa performance.
>>> %timeit x=2**100 10000000 loops, best of 3: 22.5 ns per loop |
Autre commande: %pdb
vous lancera automatiquement votre débuggeur favoris si une exception se lève durant votre session.
Se faciliter la vie
%edit
ouvre un editeur (par défault VI sous nunux, mais c’est configurable), et si vous sauvegardez, le contenu tapé est récupéré et exécuté par iPython. Génial pour les bouts de code trop relou à taper sur le prompt.
%gui qt|wx|gtk
lance l’intégration de la main loop d’un des toolkits graphiques afin pour de pouvoir faire mumuse avec des widgets sans bloquer votre shell.
Vous étiez vous demandé pourquoi le prompt iPython était plein de In
et de Out
, et pas de >>>
? Parce que tout l’historique est numéroté, et accessible:
In [38]: 1 + 1 Out[38]: 2 In [39]: In[38] Out[39]: u'1 + 1' In [40]: Out[38] Out[40]: 2 |
Mais vous pouvez aussi utiliser %doctest_mode
qui donne à votre prompt un air de shell Python normal. L’avantage ? On peut copier le contenu d’un autre shell dedans (et donc d’une doctest) avec les chevrons !
In [49]: %doctest_mode Exception reporting mode: Plain Doctest mode is: ON >>> >>> for pom in ('pom', 'pom', 'pom', 'pom'): ... ... print pom ... ... pom pom pom pom |
P’tain, c’est paaaaas bieeeeeeen de m’exciter le neurone en plein week-end et début de vacances ; ah non…c’est pas bien !
C’est pas comme ça que je vais décoller du PC… :-D
Et sinon :
Un “ou” tout court devrait suffire…
Merci à vous deux pour vos articles ; sérieux ça démoule du cake et j’adore !
C’est fou qu’il faille apprendre toute une syntaxe spécifique à iPython pour palier aux déficits intrinsèques du langage.
Comme tu le dis si bien :
Je demande au Père Noel de vous apporter un Ruby comme cadeau, comme ça, plus de parenthèses !
Ho ho ho ! :B
Lol. Sauter les parenthèses, c’est comme faire import *, ça a sa place dans le shell, pas dans un code en prod.
L’absence de parenthèses obligatoires est vraiment quelque chose que je n’aime pas dans ruby, ça rend le code beaucoup plus dur à lire car on change de context sans indicateur pour savoir qu’on le fait (l’absence de parenthèse n’étant remplacé par rien comme l’indentation remplacerait par exemple les {}).
C’est très chiant, et demande de se concentrer dès qu’on lit le code d’un autre.
En fait je trouve que l’amélioration s’est faite à l’envers: ils ont viré les parenthèses, mais gardé les mots clé de block. Avoir des mots clés de block facultatifs aurait été plus malin: on rend le code plus lisible, et on garde la puissance fonctionnelle de Ruby que n’a pas Python.
Je ne connais pas bien ipython mais je trouve la complétion de bpython vraiment top… le genre de complétion qui me ferait me passer de pycharm si on la retrouvait dans vim.
La commande magique %load est géniale aussi pour tester un bout de code qui traine sur le net.
%load url-du-code-python.py
et voilà que le code est exécuté depuis IPython sans se fatiguer avec des copier-coller.
@desfrenes vim avec jedi-vim (et python-mode) et un bpython qui tourne dans un split ConqueTerm, c’est pas loin du bonheur…
@N. Pas mal du tout !
@Soli: ouai jedi-vim est presque le seul qui fournisse une completion du code potable avec ulipad. C’est triste.