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í.
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í.
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
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 –
điều này dường như không tính đến các đối tượng mã lồng nhau – rumpel
Tại sao? không phải bytecode 2.5 tương thích với 2.7? –
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; 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