Construction

Afin de construire des exercices ayant une part d'aléatoire, ou de faciliter la création de type d'exercices réutilisables, il peut être nécessaire de passer par un script de construction de l'exercice.

Pour cela, il est possible de déclarer un script python dans une clé builder ou dans un fichier builder.py:

builder==
import sys

if __name__ == "__main__":
    [ some code ]
    sys.exit(0)
==

ou

@ chemin/vers/mon_builder.py [builder.py]

Entrées

Ce script est appelé avec 2 arguments dans cet ordre:

python3 builder.py CONTEXT_FILE MODIFIED_CONTEXT_FILE

Utilisez l'indice dans la ligne de commande (sys.argv) pour manipuler ces deux fichiers. Le nom étant défini par l'extérieur.

Pour récupérer le context, il est donc possible de faire:

import json
with open(sys.argv[1],'r') as f:
    context = json.load(f)

Sortie

Un context modifié

Doit être écrit dans MODIFIED_CONTEXT_FILE:

import json
with open(sys.argv[2], 'w+') as f:
    json.dump(context, f)

Le builder peut modifier l'ensemble du context de l'exercice.

En cas d'utilisation d'aléatoire, il faut initialiser random.seed() avec la clé seed du context.

un exemple qui ne fait rien

if __name__ == "__main__":
    if len(sys.argv) < 3:
        msg = ("Sandbox did not call builder properly:\n"
               +"Usage: python3 builder.py [input_json] [output_json]")
        print(msg, file=sys.stderr)
        sys.exit(1)
    input_json = sys.argv[1]
    output_json = sys.argv[2]
    with open(input_json,'r') as i:
        with open(output_json,"w") as o:
            o.write(i.read()) # pas de conversion de et vers json comme on ne fait rien 

La sortie d'erreur:

Afin de débuguer votre builder, il est possible de print sur la sortie d'erreur lorsque le code de retour est différent de 0 (sys.exit(1) par exemple):

import sys
print(debug_msg, file=sys.stderr)
sys.exit(1)

Dans certain cas (en cas de timeout par exemple), stderr peut ne pas être reçu. Dans ce cas, utilisez: sys.stderr.flush() après vos prints.

La sortie d'erreur est redirigée vers un fichier STDERR_FILE (actuellement stderr.log) et sera ajoutée à la fin du du message d'erreur.

En cas d'erreur, le code de retour ainsi que l'ID de l'environnement d'exécution vous seront donnés.
Si le code est 0 tout c'est bien passé. Si le code de retour est strictement positif, il s'agira du code de retour de votre grader, et stderr vous sera affiché. Si il est négatif, il s'agit d'un code interne à la sandbox (à communiquer à l'administrateur en cas de besoin), et un message d'erreur de la sandbox vous sera donné en plus de stderr.