Nouvelle config iPython


J’ai bricolé une config pour iPython dernièrement. Rappelez-vous, on peut complètement customiser ce shell.

Voici ce que j’ai dans mon ./.config/ipython/profile_default/ipython_config.py:

c.TerminalIPythonApp.exec_lines = [
'doctest_mode on',
'from __future__ import unicode_literals, absolute_import, division',
'import sys',
'import os',
'import re',
'import json',
'import base64',
'import calendar',
'import csv',
'import datetime',
'import itertools',
'import random',
'import hashlib',
'import tempfile',
'import argparse',
'import math',
'import random',
'import subprocess',
'from glob import glob',
'from uuid import uuid4',
'from datetime import datetime, timedelta',
'from collections import Counter, OrderedDict',
"""
def initial_imports():
 
    # ne faites pas ça dans un code de prod :-)
    global path, relativedelta, requests 
 
    print("\\nImported : 'sys', 'os', 're', 'json', 'base64', 'calendar', 'csv', 'datetime', 'itertools', 'random', 'hashlib', 'tempfile', 'argparse', 'math', 'random', 'glob', 'uuid4', 'datetime', 'timedelta', 'Counter', 'OrderedDict', 'subprocess'\\n")
 
    try:
        from path import path
        print('Imported : "path"')
    except ImportError:
        print("'path' is not available")
 
    try:
        from dateutil import relativedelta
        print('Imported : "relativedelta"')
    except ImportError:
        print("'dateutil' is not available")
 
    try:
        import requests
        print('Imported : "requests"')
    except ImportError:
        print("'requests' is not available")
 
    try:
        env = os.environ['VIRTUAL_ENV']
        print("\\nENV '{}'. You can import:\\n".format(os.path.basename(env)))
        cmd = subprocess.check_output([env + "/bin/pip", "freeze"],
                                      stderr=subprocess.STDOUT).strip().split("\\n")
        p = re.compile(r'(^.*\:\s)|((#|@).*$)|(==.*$)')
        print("'" + "', '".join(sorted(set(os.path.basename(p.sub('', f)) for f in cmd))) + "'")
    except KeyError:
        pass
 
    print('')
""",
"initial_imports()"
]

Du coup, au démarrage d’iPython j’ai les bénéfices suivant :

  • Comportement de Python 3 pour l’unicode, les imports et la division. Ils sont plus sains et facile à manipuler (plus besoin de préfixer de ‘u’ les chaînes par exemple).
  • J’ai tout de suite sous la main une tonne de modules que j’utilise souvent sans avoir à les importer (os, datetime, random, etc).
  • J’importe aussi des modules optionnels (path, requests…).
  • Je sais si je suis dans un environnement virtuel, et si oui, ce qu’il y a installé dedans.

Je vire aussi la bannière de démarrage :

c.TerminalIPythonApp.display_banner = False

Et hop, mon affichage au démarrage ressemble à ça :

$ ipython
Exception reporting mode: Plain
Doctest mode is: ON

Imported : 'sys', 'os', 're', 'json', 'base64', 'calendar', 'csv', 'datetime', 'itertools', 'random', 'hashlib', 'tempfile', 'argparse', 'math', 'random', 'glob', 'uuid4', 'datetime', 'timedelta', 'Counter', 'OrderedDict', 'subprocess'

'path' is not available
'dateutil' is not available
Imported : "requests"

ENV 'my_env'. You can import:

'BeautifulSoup', 'Django', 'Fabric', 'Jinja2', 'Pillow', 'Pygments', 'Sphinx', 'URLObject', 'Werkzeug', 'argparse', 'beautifulsoup4', 'colorlog', 'distribute', 'django-appconf', 'django-bootstrap-pagination', 'django-bootstrap-toolkit', 'django-compressor', 'django-debug-toolbar', 'django-extensions', 'django-guardian', 'django-loginas', 'django-model-utils', 'django-pdb', 'django-pytest', 'django-rest-framework.git', 'django-template-repl', 'docutils', 'easy-thumbnails', 'feedparser', 'gunicor

Ça fait un gros bloc visuellement, mais ça ne s’affiche qu’une fois, et le délai est acceptable.

Si j’ai besoin de l’info à nouveau, je peux toujours appeler :

initial_imports()

Que ce genre de choses soient possibles et faciles me font adorer Python. La force du langage, ce n’est pas seulement son core, c’est tout son environnement, ses libs, ses outils qui gravitent autour qui rendent l’expérience de dev fantastique.

9 thoughts on “Nouvelle config iPython

  • Etienne

    Cool ça, je retiens.

    Pourquoi les “\n” sont escaped (oufti, mon english s’améliore, t’as vu)?

    Et la listes “Imported”, tu la mets à jour manuellement ?

    Et Django, c’est quoi ?

    Et pourquoi les abeilles elles ont pas de zizi ?

  • Sam Post author

    @Etienne : on escape le ‘\’ avec un autre ‘\’ car chaque ligne est exécutée avec un appel à exec(). Donc soit tu met un “r” avant, soit tu escape tes string, car tu vas avoir une double interprétation de ta string : une fois avec le exec, et une fois dans le exec.

    Oui je la met à jour manuellement, je rajoute pas une lib tous les 4 matins. Je sais exactement ce que j’utilise. Mais on pourrait taper dans locals() si tu veux faire ça dynamiquement.

    Django c’est un framework Web écrit en Python, c’est à dire une collection de libs qui permet d’écrire un site Web de A à Z. En l’occurence, c’est un très beau framework.

  • residante

    Je ne comprend pas. Le fait d’importer les modules dans une fonction ne rend pas le modules accessibles au lancement (en dehors de la fonction), donc tu utilises initial_import juste pour des informations sur les modules importables/disponibles ?

  • Sam Post author

    Lol, effectivement, il manque global path, relativedelta, requests.

  • Sam Post author

    Au passage je copie un tweet qu’on nous a envoyé :

    U can also put files into ./.config/ipython/profile_default/startup/ easier than a list of strings… (BTW IPython not iPython)

  • Krypted

    J’ai entré mes imports comme ceci :
    c.TerminalIPythonApp.exec_lines = [
    'from pprint import pprint',
    'import os, sys, re, json'
    ]

    Bizarrement quand je lance ipython directement j’ai bien les modules importés.
    Mais quand ipdb+ipython est démarré avec un ipdb.set_trace()
    aucun des import n’est lancé. Faut-il configurer quelque chose avec ipdb ?

Comments are closed.

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