dimanche 30 décembre 2012

galères de packaging

Une note rapide pour relater un problème que j'ai eu aujourd'hui.

J'ai cette semaine joué avec setuptools en Python pour packager mon yapong. Après le python setup.py install, impossible de trouver mes fichiers wav (sur ce jeu, toute l'immersion est basée sur l'utilisation du son).

Lors de mes tests dans le répertoire de développement, pas de problème, je peux récupérer mes fichiers.

Lors du lancement à partir de l'entry point généré par setuptools, impossible pour l'application de retrouver les wav. Pourquoi donc ?

Naïvement, lors du développement, je récupérais le chemin vers mes fichiers en faisant :

fullpath = os.path.join('.', 'sounds', 'file.wav')

Dans l'esprit, ce n'était pas si bête car l'interpréteur utilise des chemins relatifs au script appelant pour importer les modules... Mais en fait si : c'était con. Lorsqu'on appelle le script d'un répertoire quelconque, le current working directory (donné par os.getcwd) est bien évidemment le répertoire de travail : Python peut toujours chercher vos fichiers, il ne risque pas de les trouver !

Voici l'astuce, qui marche tout le temps et qui lève toute incertitude. J'ai changé la ligne donnée plus haut en :

fullpath = os.path.join(os.dirname(__file__), 'sounds', 'file.wav')

En effet la variable __file__ stocke le chemin complet du fichier .py / .pyc de votre module. Si vous savez situer un fichier relativement à votre fichier de module, vous pouvez alors le situer avec exactitude dans tous les cas, que votre appli soit en dev, déployée sur tout le système ou dans virtualenv (a priori : je n'ai pas essayé d'installer pygame dans un virtualenv : trop de dépendances et un bambin impatient sur les genoux).

Voilà, c'est tout con mais j'espère que mon errance servira à d'autres.

HS : et oui, ça veut dire que je suis allé jusqu'au bout de mon projet merdique de jeu en Python, jusqu'au packaging ! Incroyabulu ! Il est temps à présent de passer à un autre défi.