2011-12-25 4 views
11

Come potrei generare un file .pyc da un AST Python tale da poter importare il file da Python?Genera .pyc da Python AST?

ho usato compile per creare un oggetto di codice, poi scritto l'attributo co_code in un file, ma quando cerco di importare il file da Python, ottengo un ImportError: Bad magic number in output.pyc.

risposta

14

La soluzione può essere adattata dal modulo py_compile:

import marshal 
import py_compile 
import time 
import ast 

codeobject = compile(ast.parse('print "Hello World"'), '<string>', 'exec') 

with open('output.pyc', 'wb') as fc: 
    fc.write('\0\0\0\0') 
    py_compile.wr_long(fc, long(time.time())) 
    marshal.dump(codeobject, fc) 
    fc.flush() 
    fc.seek(0, 0) 
    fc.write(py_compile.MAGIC) 

+4

Questo è proprio quello che stavo cercando. Ma ho scoperto che potevo semplicemente scrivere py_compile.MAGIC prima, invece di \ 0 \ 0 \ 0 \ 0, senza dover cercare all'inizio e riscrivere quei 4 byte. – Matthew

2

La funzione standard compile fornisce questa funzione sia per Python 2.x che per Python 3.x. Tuttavia, troverete che la rappresentazione AST tra 2.xe 3.x è abbastanza diversa, quindi preparatevi per quello.

+0

lo prendo l'attributo 'co_code' sull'oggetto codice restituito è il codice byte che sto cercando? – exupero

+0

Molto probabilmente. L'unica cosa che ho fatto con un oggetto codice è passarlo a 'exec' o' eval', non ho controllato direttamente il bytecode. –

+0

Ho modificato la domanda per essere più specifica in base a ciò che ho imparato da questa risposta. – exupero