Zoeken…


Constanten in de dis-module

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', '...

Wat is Python bytecode?

Python is een hybride tolk. Wanneer een programma wordt uitgevoerd, wordt het eerst in bytecode samengevoegd en vervolgens in de Python-interpreter uitgevoerd (ook een virtuele Python-machine genoemd ). De dis module in de standaardbibliotheek kan worden gebruikt om de Python-bytecode leesbaar te maken door klassen, methoden, functies en code-objecten te demonteren.

>>> 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

De Python-interpreter is stack-gebaseerd en maakt gebruik van een first-in last-out systeem.

Elke operatiecode (opcode) in de Python-assembleertaal (de bytecode) neemt een vast aantal items uit de stapel en retourneert een vast aantal items naar de stapel. Als er onvoldoende items op de stapel staan voor een opcode, crasht de Python-interpreter, mogelijk zonder een foutmelding.

Demontage modules

Om een Python-module te demonteren, moet dit eerst worden omgezet in een .pyc bestand (gecompileerd Python). Om dit te doen, ren

python -m compileall <file>.py

Ren dan in een tolk

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

Dit zal een Python-module compileren en de bytecode-instructies uitvoeren met dis . De module wordt nooit geïmporteerd, dus het is veilig om te gebruiken met niet-vertrouwde code.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow