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 :

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