Python Language
Le module dis
Recherche…
Constantes dans le module dis
EXTENDED_ARG = 145 # All opcodes greater than this have 2 operands
HAVE_ARGUMENT = 90 # All opcodes greater than this have at least 1 operands
cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', 'is ...
# A list of comparator id's. The indecies are used as operands in some opcodes
# All opcodes in these lists have the respective types as there operands
hascompare = [107]
hasconst = [100]
hasfree = [135, 136, 137]
hasjabs = [111, 112, 113, 114, 115, 119]
hasjrel = [93, 110, 120, 121, 122, 143]
haslocal = [124, 125, 126]
hasname = [90, 91, 95, 96, 97, 98, 101, 106, 108, 109, 116]
# A map of opcodes to ids
opmap = {'BINARY_ADD': 23, 'BINARY_AND': 64, 'BINARY_DIVIDE': 21, 'BIN...
# A map of ids to opcodes
opname = ['STOP_CODE', 'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'DUP_TOP', '...
Qu'est-ce que le bytecode Python?
Python est un interpréteur hybride. Lors de l'exécution d'un programme, il l'assemble d'abord dans un bytecode qui peut ensuite être exécuté dans l'interpréteur Python (également appelé machine virtuelle Python ). Le module dis
de la bibliothèque standard peut être utilisé pour rendre le bytecode Python lisible par l'homme en désassemblant des classes, des méthodes, des fonctions et des objets de code.
>>> def hello():
... print "Hello, World"
...
>>> dis.dis(hello)
2 0 LOAD_CONST 1 ('Hello, World')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
L'interpréteur Python est basé sur une pile et utilise un système premier entré, dernier sorti.
Chaque code d'opération (code opération) dans le langage d'assemblage Python (le bytecode) prend un nombre fixe d'éléments de la pile et renvoie un nombre fixe d'éléments à la pile. S'il n'y a pas assez d'éléments dans la pile pour un code opération, l'interpréteur Python se bloque, éventuellement sans message d'erreur.
Démontage des modules
Pour démonter un module Python, il faut d'abord le transformer en fichier .pyc
(compilé Python). Pour ce faire, lancez
python -m compileall <file>.py
Ensuite, dans un interprète, exécutez
import dis
import marshal
with open("<file>.pyc", "rb") as code_f:
code_f.read(8) # Magic number and modification time
code = marshal.load(code_f) # Returns a code object which can be disassembled
dis.dis(code) # Output the disassembly
Cela compilera un module Python et affichera les instructions bytecode avec dis
. Le module n'est jamais importé, il est donc sûr d'utiliser un code non fiable.