SkayaWiki

PersistentPython

JeromePetazzoni :: DerniersChangements :: DerniersCommentaires? :: ParametresUtilisateur :: http://www.enix.org/ :: Vous êtes ec2-3-144-25-130.us-east-2.compute.amazonaws.com

Objectifs

Le but du projet est d'écrire un programme Python, qu'on appellera "pp" (comme "persistent Python"), et qui permette de conserver d'une exécution à l'autre les variables, fonctions, classes, modules...
Un petit exemple vaut mieux qu'un long discours :

toto:~$ pp
Python 2.4.4c0 (#2, Apr 22 2006, 22:39:06)
[GCC 4.0.3 (Debian 4.0.3-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Persistent Python 1.0 ; file ~/.pp not found, starting a new session.
>>> x=4
>>> import sys
>>> def err(s): print >> sys.stderr, s
...
>>> [Ctrl+D]
Session saved to ~/.pp (1kB)
toto:~$

À l'issue de cette première session, un fichier ~/.pp est créé, et contient toutes les variables, fonctions, etc. qui ont été définies.
Une deuxième session permettra de les retrouver à l'identique :

toto:~$ pp
Python 2.4.4c0 (#2, Apr 22 2006, 22:39:06)
[GCC 4.0.3 (Debian 4.0.3-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Persistent Python 1.0 ; loaded file ~/.pp, resuming session.
>>> err(x)
4
>>> [Ctrl+D]
Session saved to ~/.pp (1kB)
toto:~$

Quelques détails techniques

- si un objet est difficilement sérialisable (une socket par exemple), il faut le remplacer par un objet bidon lors de la sauvegarde. Lors du chargement de la session, les accès à cet objet leveront une VolatileException? ;
- les modules pourront être sérialisés par nom ou par contenu, au choix ;
- les objets "built-in" seront bien entendu sauvegardés par nom ;
- l'interpréteur persistent-Python doit posséder un module "pp", donnant accès à au moins deux fonctions : pp.load(sessfile="~/.pp") et pp.save(sessfile="~/.pp"), qui vont respectivement charger et sauver une session dans le fichier indiqué (en prenant le fichier ~/.pp par défaut si aucun argument n'est précisé).

Quelques pistes

- les built-in globals() et locals() (vus en TD) permettent de récupérer les variables qui existent à un instant donné ;
- le module "inspect" contient des fonctions permettant d'examiner n'importe quel objet Python ;
- le built-in "dir" permet aussi d'examiner le contenu d'un objet Python ;
- le module "new" contient des fonctions permettant de construire presque n'importe quel objet Python ;
- le module "code" contient des classes permettant de construire un interpréteur Python "custom" ;
- alternativement, le built-in "exec" permet d'exécuter une ligne de code Python dans un environnement contrôlé.

Barême

- l'ensemble des fonctionalités décrites (à l'exception de la gestion des classes) compte environ 15 points
- la gestion des classes représente les 5 points restants

L'ensemble doit fonctionner parfaitement. Les bugs compteront des points en moins.
La gestion d'options (sérialisation d'un fichier ouvert, d'une socket en écoute, ...) comptera en point de bonus.
Il n'est pas nécessaire de rédiger un rapport ; mais une explication de quelques lignes décrivant les fonctionalités implémentées est indispensable, ainsi qu'un exemple de fonctionnement.

Délais

La version définitive doit être rendue pour le mercredi 22 août 2007. Si vous rendez une version (partielle ou définitive) au moins 15 jours avant cette date, je vous propose de la corriger en moins de 15 jours afin de vous permettre de la modifier avant le rendu définitif.
Le rendu se fera par mail, qui devra être crypté par PGP avec la clé dont le fingerprint figure sur la page d'accueil de mon site.

Pour me contacter : jp at enix point org.
(Vous n'êtes pas obligés d'utiliser PGP pour m'envoyer vos questions ; juste pour le rendu! ;-))
Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]