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'}