Génération de fichiers en Python

English   |   Source

Il est aisé de générer du texte (donc des fichiers ASCII, donc du code source) en Python en suivant un modèle. Je vois régulièrement une utilisation un peu incensée du print lorsque l'on peut utiliser, de manière plus élégante, des templates.

Principe de base

Le principe est très simple : on va créer un fichier source avec des variables à substituer (avec le formattage Python habituel), qu'on va ensuite charger, avant d'effectuer les substitutions et d'écrire le fichier dûment modifié.

Avant d'entrer dans les détails un peu plus techniques, il est important de souligner que cette approche est beaucoup plus agréable et moins propice aux erreurs que le fait de faire une série de print. Agréable, parce qu'il est aisé de partir d'un fichier source préexistant, et qu'en conservant l'extension souhaitée en sortie, on garde par exemple le formattage dans son éditeur de texte favori. Moins propice aux erreurs, pour la même raison : en travaillant à partir de sources préexistantes, on peut facilement vérifier que tout fonctionne correctement avant de devoir débugger du Python et ces sources en parallèle en cas d'erreur.

Application

On peut prendre appliquer cette idée avec un simple hello world en bash :

  • on prépare un fichier template qui contient la variable var :
$ more ex.sh
#!/bin/bash
echo "%(var)s"
  • puis en Python on ouvre, susbstitue et écrit un nouveau fichier :
#!/usr/bin/env python

template = open("ex.sh", "rt").read()
data = {"var": "Hello world!"}
with open("exm.sh", "wt") as output:
    output.write(template %data)
  • ... qu'on peut exécuter :
$ sh exm.sh
Hello world!

Un exemple un peu plus complet peut se retrouver sur GitHub, mais l'idée est exactement la même. J'ai aussi appliqué ce principe dans DUMSES-Hybrid par exemple (cet exemple est particulièrement intéressant pour les tabulations, car j'avais besoin de vraies tabulations et non d'espaces pour générer des makefiles).