2017-10-03 4 views
0

J'ai besoin de créer un graphe d'appel de la fonction python, puis de modifier le bytecode de certaines fonctions.Comment obtenir un objet de code de fonction à partir du bytecode?

j'ai commencé à jouer avec le démontage et constaté que la fonction est faire par MAKE_FUNCTION opcode et l'objet de code en quelque sorte passé à ce

32   96 LOAD_CONST    25 ((None, None, True, 'off', None, False)) 
      98 LOAD_CONST    15 (<code object foobar at 0x7fc46bff6d20, file "foo.py", line 25>) 
      100 LOAD_CONST    16 ('foo') 
      102 MAKE_FUNCTION   1 
      104 STORE_NAME    15 ('fun') 

D'accord, je trouve les racines du graphe d'appels dans ce dossier, mais ce qu'il faut faire prochain? Comment puis-je obtenir cet objet de code?

Répondre

0

Le type de fonction est ce que vous voulez. Vous pouvez l'obtenir à partir du module types (où il est types.FunctionType) ou juste type(lambda:0). Effectuez un help() sur le type pour voir les arguments requis pour créer un objet fonction.

La principale chose dont vous avez besoin pour construire la fonction est l'objet code. Vous pouvez obtenir cela à partir d'une fonction existante f en utilisant f.func_code. Si vous modifiez le bytecode, vous devrez créer un nouvel objet de code pour le contenir. Son type peut être obtenu en utilisant type() comme avec la fonction et faire un help() sur le type vous dira ce que vous devez passer po

Si vous basez la nouvelle fonction sur un existant, alors vous pouvez creuser la plupart des ce dont vous avez besoin de la fonction existante. Voir this table dans la documentation du module inspect pour voir quels attributs des fonctions et des objets de code contiennent des choses qui vous intéressent.

+0

Um ... Je ne vois pas comment cela répond à ma question. J'ai un fichier pyc, je l'ai démonté avec 'dis.dis'. Alors quoi? – user1685095

+0

Donc vous avez la fonction, ou vous ne pouviez pas l'avoir démonté avec 'dis'. Donc l'objet code de la fonction 'f' est' f.func_code' et la chaîne bytecode est 'f.func_code.co_code'. Vous dites que vous voulez modifier le bytecode, et une fois que vous faites cela, vous devrez en construire une nouvelle, ce que vous pouvez faire en utilisant le code et les types de fonctions. – kindall

+0

Que faire si je n'ai pas de fichiers source et que je n'ai que des fichiers compilés? – user1685095