2011-12-25 13 views
11

¿Cómo generaría un archivo .pyc de Python AST para poder importar el archivo desde Python?¿Generas .pyc desde Python AST?

He usado compile para crear un objeto de código, a continuación, escrito el atributo co_code a un archivo, pero cuando intento importar el archivo de Python, me sale un ImportError: Bad magic number in output.pyc.

Respuesta

14

La solución se puede adaptar desde el módulo 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

Esto es justo lo que estaba buscando. Pero descubrí que podía escribir py_compile.MAGIC primero, en lugar de \ 0 \ 0 \ 0 \ 0, sin tener que volver al principio y volver a escribir esos 4 bytes. – Matthew

2

La función estándar compile proporciona esta función tanto para Python 2.x como para Python 3.x. Sin embargo, encontrará que la representación de AST entre 2.x y 3.x es bastante diferente, así que prepárese para eso.

+0

tomo el atributo 'co_code' en el objeto código devuelto es el código de bytes que estoy buscando? – exupero

+0

Muy posiblemente. Lo único que he hecho con un objeto de código es pasarlo a 'exec' o' eval', no he inspeccionado el bytecode directamente. –

+0

He editado la pregunta para que sea más específica en función de lo que aprendí de esta respuesta. – exupero