2011-10-05 5 views
12

Làm cách nào tôi có thể biên dịch lại một số tệp .pyc được tạo bởi Python 2.5 bằng Python 2.7?Làm cách nào để biên dịch lại mã byte 2.5 của Python thành 2.7?

Tôi không có tệp nguồn và tôi không thể lấy được.

Tôi đang tìm giải pháp miễn phí.

+2

Tại sao? không phải bytecode 2.5 tương thích với 2.7? –

+1

Tôi sẽ không đặt cược vào nó. Định dạng bytecode chính xác thường là chi tiết triển khai và không được mong đợi là có thể di chuyển được. – delnan

+1

+1; Tôi không biết đây có phải là một ý hay hay không, nhưng đó là một câu hỏi thú vị. – SingleNegationElimination

Trả lời

3

Bạn sẽ cần Python 2.5 và 2.7 và byteplay (http://code.google.com/p/byteplay/) được cài đặt cho cả hai.

diz.py:

#!/usr/bin/env python 
import byteplay, marshal, sys 
if __name__ == '__main__': 
    sys.stdin.read(8) 
    c = byteplay.Code.from_code(marshal.load(sys.stdin)).code 
    labels = set([ x for l in c for x in l if isinstance(x, byteplay.Label) ]) 
    labels = dict([(l,i) for (i,l) in enumerate(labels)]) 
    byteplay.Label.__repr__ = lambda self: "labels[%d]" % labels[self] 
    print repr(c) 

az.py:

#!/usr/bin/env python 
import byteplay, sys, imp, struct, marshal, time 
if __name__ == '__main__': 
    byteplay.labels = dict([(i, byteplay.Label()) for i in xrange(10000)]) 
    if sys.platform == "win32": 
     import os, msvcrt 
     msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 
    asm = sys.stdin.read() 
    c = eval(asm, byteplay.__dict__) 
    c = byteplay.Code(c,(),(), 0, 0, 0, '', '', 0, '').to_code() 
    sys.stdout.write(imp.get_magic()) 
    sys.stdout.write(struct.pack('<L', time.time())) 
    marshal.dump(c, sys.stdout) 

sử dụng:

python2.5 diz.py <foo.pyc> foo.az 
python2.7 az.py <foo.az> foo.2.7.pyc 
+1

Tất nhiên vì sự khác biệt về api mô-đun có thể tăng ngoại lệ khi chạy trên 2.7 nhưng sau đó bạn luôn có thể truy cập và hack cụm được sản xuất bởi diz.py –

+0

điều này dường như không tính đến các đối tượng mã lồng nhau – rumpel