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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow