Votre navigateur n'est pas à jour !

Merci de mettre à jour votre navigateur pour utiliser mon blog. Mettre à jour mon navigateur maintenant

×

Python - Analyser le bytecode python

Date de publication 16 juin 2020
Le module dis permet d'analyser le bytecode python en le désassemblant.

Pour rappel un bytecode est le code compilé par l'interpréteur python. C'est-à-dire à chaque fois que vous lancez un script python, l'interpréteur (généralement CPython) va généré le bytecode, avec les instructions comprises par le systeme. Depuis python 3.2 ces binaires sont maintenant dans un dossier __pycache__, toujours avec les extensions pyc.
Cela permet lors du prochain appel de charger plus rapidement le module.

Prenons comme exemple la fonction suivante, avec l'utilisation de dis

Les données affichées par colonnes correspondent aux informations suivantes,
  • 1 => Le numéro de la ligne dans le code
  • 2 => L'instruction courante executée
  • 3 => Un label indiquant un possible JUMP d'une instruction précédente
  • 4 => L'adresse dans le bytecode, cela sera toujours un multiple de 2 en python > 3.6 car chaque instruction prend 2 octets
  • 5 => opname qui est l'instruction bytecode, on trouvera la liste sur la doc python
  • 6 => Les arguments de l'instruction
  • 7 => La partie de code python liée à l'instruction
Chaque instruction du bytecode est découpé en "Code Object" et écrit en C (pour CPython).

Pour visualiser ce code object il faut simplement ajouter __code__ à la fin d'une instruction python

Pour exécuter un Code Object il faut soit passer par un exec() soit par eval(), le 1er permet de gérer le code python sur plusieurs lignes tandis que eval() gère uniquement les instructions simples.

On peut également obtenir des informations sur le code compilé

Voilà les informations minimales à avoir pour faire de l'analyse de bytecode.

Si vous cherchez un moyen d'obtenir le code à partir d'un bytecode il existe aussi un décompileur facilement accessible
blog comments powered by Disqus