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.
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 ?
Ici: C’est la caverne d’Ali-Baba !
@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.
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 ?
Lol, effectivement, il manque
global path, relativedelta, requests
.Au passage je copie un tweet qu’on nous a envoyé :
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 ?
Je pense tout simplement que comme ipython est setupé à la main (https://github.com/gotcha/ipdb/blob/master/ipdb/__main__.py) par pdb, il ne charge pas le fichier de config.
Il faut ouvrir un ticket ^^
Merci pour l’ouverture du ticket :)