jeudi 2 juillet 2015

Python - Fichier startup pour le shell

On en apprend un peu tout les jours...
Cet article de Sam&Max se penche sur la variable d'environnement PYTHONSTARTUP qui permet d'indiquer un fichier .py à exécuter au démarrage d'un shell Python.

Si cette option peut paraître farfelue de prime abord, elle est très pratique pour le manipulations et tests.
Avec ce fichier startup vous pouvez:
  • Déjà pré-importer les bibliothèques que vous utilisez au jour le jour.
  • Vous préparer un répertoire Temporaire prêt à l'emploit.
  • Afficher le détail de l'environnement virtuel (s'il est activé)
  • Créer des raccourcis pour les fonctions p = print et pp = pprint.
  • *** UNE PERLE *** Créer un objet Store pour garder des objets entre deux sessions shell!!.
Vous trouverez ci-dessous le petit bout de code de l'objet Store... voyez la source dans l'article de Sam&Max. L'idée est vraiment génial et l'utilisation vraiment fluide.

import sys
import os
import shelve
import atexit

... voyez le code complet dans 
... l'article de SAM & MAX

# avoir un dico persistant pour garder des objets entre deux sessions. Pratique quand
# on a un gros array numpy qu'on n'a pas envie de se faire chier à se recréer
class Store(object):
    def __init__(self, filename):
        object.__setattr__(self, 'DICT', shelve.DbfilenameShelf(filename))
        # cleaning the dict on the way out
        atexit.register(self._clean)
 
    def __getattribute__(self, name):
        if name not in ("DICT", '_clean'):
            try:
                return self.DICT[name]
            except:
                return None
        return object.__getattribute__(self, name)
 
    def __setattr__(self, name, value):
        if name in ("DICT", '_clean'):
            raise ValueError("'%s' is a reserved name for this store" % name)
        self.DICT[name] = value
 
    def _clean(self):
        self.DICT.sync()
        self.DICT.close()
 
# Ainsi on peut faire store.foo = 'bar' et récupérer store.foo à la session
# suivante. Moi je store tout dans un truc temporaire mais si vous voulez
# garder la persistance entre deux reboots, il suffit de choisir un autre
# dossier. 
python_version = "py%s" % sys.version_info.major
store = Store(os.path.join(TEMP_DIR, 'store.%s.db') % python_version)



Ressource

Aucun commentaire: