Bien configurer son environnement de développement Python : Personnaliser le script de démarrage du shell Python. Partie 2
Après avoir vu comment gérer plusieurs projets Python dans des environnements virtuels séparés grâce à virtualenvwrapper, nous allons voir à présent comment personnaliser le script de démarrage qui est exécuté automatiquement lorsque l'on démarre un shell Python.
Cet article fait partie fait partie d'une série d'articles présentant quelques bonnes pratiques qui vous permettront d'avoir un environnement de développement Python aux petits oignons :
- Les environnements virtuels. Partie 1
- Personnaliser le script de démarrage du shell Python. Partie 2
- Valider son code Python avec flake8. Partie 3
- Standardiser l'exécution des tests avec tox. Partie 4
Personnaliser le script de démarrage du shell Python
Python met à disposition la variable d'environnement PYTHONSTARTUP qui permet de choisir un script de démarrage qui sera exécuté automatiquement lorsque l'on démarre un shell Python. Cette variable attend un chemin absolu vers un fichier qui peut contenir n'importe quel code Python :
# Config à ajouter dans ~/.bashrc ou ~/.profile export PYTHONSTARTUP=~/python_startup_script.py
Voici un exemple de script de démarrage qui :
- Importe quelques fonctions de compatibilité Python 3
- Importe des modules de la librairie standard que j'utilise fréquemment
- Importe des modules additionnels potentiellement présents
- Et si on est au sein d'un environnement virtuel :
- Affiche le nom de l'environnement virtuel dans le prompt
- Affiche la liste des modules qui ont été installés avec pip
#!/usr/bin/env python # -*- coding: utf-8 -*- # Compatibilité Python 3 from __future__ import unicode_literals, print_function, absolute_import # Quelques modules de la lib standard import sys import os import json import re import subprocess from pprint import pprint from datetime import datetime, timedelta # Modules additionnels potentiellement présents try: import requests except ImportError: pass # Environnement virtuel ? env = os.environ.get('VIRTUAL_ENV') if env: # Affiche le nom de l'environnement virtuel dans le prompt env_name = os.path.basename(env) sys.ps1 = '({0}) {1} '.format(env_name, getattr(sys, 'ps1', '>>>')) # Affiche la liste des modules qui ont été installés avec pip print("\nVirtualenv '{}' contains:".format(env_name)) cmd = subprocess.check_output( [env + "/bin/pip", "freeze"], stderr=subprocess.STDOUT ) try: cmd = cmd.decode('utf8') except: pass modules = [ "'{}'".format(m.split('==')[0]) # exemple: u'Django==1.8.4' => u'Django' for m in cmd.strip().split("\n") ] print(', '.join(sorted(modules)) + '\n') print('Use Python startup script : {}\n'.format(os.environ.get('PYTHONSTARTUP')))
Et à présent lorsque l'on lance un shell au sein d'un environnement virtuel :
mkvirtualenv project (project) pip install requests Django (project) python [...] Virtualenv 'project' contains: 'Django', 'requests' Use Python startup script : ~/python_startup_script.py (project) >>> pprint({i: 'c' + 'o'*i + 'l' for i in range(2, 10)}) {2: u'cool', 3: u'coool', 4: u'cooool', 5: u'coooool', 6: u'cooooool', 7: u'coooooool', 8: u'cooooooool', 9: u'coooooooool'}