URL: https://linuxfr.org/news/hackinscience-automatiser-l-enseignement-de-python Title: HackInScience : automatiser l'enseignement de Python Authors: JulienPalard Xavier Teyssier, Pierre Jarillon, patrick_g, palm123 et Ysabeau đ§¶ Date: 2021ćčŽ01æ13æ„T22:43:53+01:00 License: CC By-SA Tags: python, apprendre_Ă _coder et exercice Score: 38 HackInScience est un logiciel de publication et de correction automatique d'exercices, son instance [hackinscience.org](https://hackinscience.org) est une collection d'exercices Python. HackInScience est nĂ© en 2014 : j'enseignais alors le Python en universitĂ© (promos d'environ 70 Ă©lĂšves), et avec les collĂšgues on s'est dit qu'il serait bon de passer plus de temps Ă aider les Ă©lĂšves qu'a les corriger, que la correction c'Ă©tait automatisable, mais que passer du temps avec eux, ça ne l'Ă©tait pas. Deux "on jette tout et on recommence" plus tard, et deux confinements plus tard, on en est lĂ : Tout le code est [open-source](https://framagit.org/hackinscience/hkis-website), c'est un simple Django pour prĂ©senter les exercices, des websockets pour recevoir sans attendre la correction du bot, et un Celery pour "load-balancer" les rendus aux serveurs de correction. Je n'enseigne plus en universitĂ© mais le site Ă©tant toujours en ligne, et les confinements aidant, il a trouvĂ© son public : 1500 exercices sont rĂ©ussis par semaine en ce moment. Jâessaye de passer deux semaines par an Ă plein temps sur le projet, en 2019 jâai travaillĂ© lâinternationalisation (ĂȘtre traducteur de la doc de Python et ne pas traduire ses propres projets nâĂ©tait pas bien sĂ©rieux...), et en 2020 la notion de classement et dâĂ©quipes. ---- [Site d'HackInScience](https://www.hackinscience.org/) ---- ## Du point de vue d'un Ă©lĂšve L'interface est minimaliste (d'abord parce que je suis plutĂŽt nul en front :p) :  Ă gauche l'Ă©noncĂ©, au milieu l'utilisateur rĂ©dige son code, et Ă droite la rĂ©ponse du bot. C'est simple et il n'y a pas de place pour de la pub ;) ## Du point de vue admin C'est toute suite plus compliquĂ© et mon but n'Ă©tant pas de rĂ©diger la documentation ici je vais passer vite sur les dĂ©tails les moins intĂ©ressants. Pour l'installation d'une instance HackInScience je pense qu'un bon point de dĂ©part serait de s'inspirer de notre [playbook Ansible](https://framagit.org/hackinscience/hkis-ansible), mais pour un test local un `python manage.py runserver` suffit. La crĂ©ation d'exercices se passe dans un django-admin classique :  Mais pour plus de confort j'ai pris l'habitude d'Ă©diter les exercices localement (emacs Ă©tant un peu plus confortable que ACE Editor pour Ă©diter du Python), de les versionner, et de tester mes modifications avant de les publier, pour ça j'utilise `fetch.py` et `push.py` dans le dossier `scripts/`. La partie intĂ©ressante de la crĂ©ation d'un exercice, c'est son bot de correction : c'est aussi un script Python qui est appelĂ© dans une sandbox Ă cĂŽtĂ© du rendu. La rĂ©daction de ce script est totalement libre, la seule rĂšgle c'est : s'il print (sur stderr ou stdout) l'exercice est faux, sinon il est considĂ©rĂ© juste. Pour me faciliter le travail j'ai crĂ©e [correction-helper](https://github.com/JulienPalard/correction-helper) qui lui mĂȘme utilise [friendly-traceback](https://github.com/aroberge/friendly-traceback/), Ă l'usage, rĂ©diger un bot de correction ressemble Ă : ```python for message in test_messages: expected = bencode(message) with student_code(): got = student_encode(message) if expected != got: message = _("Wrong answer while testing `{thing}`").format(thing=f"bencode({message!r})") if type(got) != bytes: message += "\n\n" + f"Expected a `bytes` instance, got a `{type(got)}`." fail(message, _("Got:"), code(got), _("Expected:"), code(expected)) ``` Alors corriger du Python depuis du Python c'est assez simple, je peux soit utiliser `subprocess.run` pour exĂ©cuter le code de l'Ă©lĂšve, soit importer ses fonctions et les tester, ça ressemble beaucoup Ă de la rĂ©daction de tests unitaires, sauf qu'au lieu de se contenter d'un `assert` on rĂ©dige une description explicite de l'erreur, et parfois des conseils pour l'Ă©viter. Mais corriger du bash, du C, ou n'importe quoi d'autre doit ĂȘtre tout Ă fait possible aussi : rien n'empĂȘche de rĂ©diger une moulinette qui compile le code de l'Ă©lĂšve puis le teste Ă coup de `subprocess.run` aussi.