2011-12-25 20 views
11

Jak wygenerować plik .pyc z Pythona AST tak, żebym mógł zaimportować plik z Python?Wygenerować .pyc z Python AST?

Użyłem compile utworzyć obiekt kodu, a następnie zapisywane atrybut co_code do pliku, ale gdy próbuję zaimportować plik z Pythona, otrzymuję ImportError: Bad magic number in output.pyc.

Odpowiedz

14

Rozwiązaniem może być dostosowany z modułu 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

Tego właśnie szukałem. Ale odkryłem, że mogę po prostu napisać py_compile.MAGIC zamiast \ 0 \ 0 \ 0 \ 0, bez konieczności szukania z powrotem na początku i przepisywania tych 4 bajtów. – Matthew

2

Standardowa funkcja compile zapewnia tę funkcję zarówno dla Pythona 2.x, jak i dla Pythona 3.x. Jednak przekonasz się, że reprezentacja AST między 2.x a 3.x jest zupełnie inna, więc bądź na to przygotowany.

+0

biorę go 'co_code' atrybut obiektu zwróconego kodu jest kod bajtowy szukam? – exupero

+0

Całkiem możliwe. Jedyne co zrobiłem z obiektem kodu to przekazanie go do 'exec' lub' eval', nie sprawdziłem bezpośrednio kodu bajtowego. –

+0

Zmieniłem to pytanie, by było bardziej szczegółowe w oparciu o to, czego dowiedziałem się z tej odpowiedzi. – exupero