2011-10-05 72 views
12

如何重新編譯由Python 2.5與Python 2.7創建的一些.pyc文件?如何重新編譯Python 2.5字節碼爲2.7?

我沒有源文件,我無法獲得它。

我正在尋找一個免費的解決方案。

+2

爲什麼?是不是2.5與2.7兼容的字節碼? –

+1

我不會賭它。確切的字節碼格式通常是一個實現細節,預計不會是可移植的。 – delnan

+1

+1;我不知道這是一個好主意,但這是一個有趣的問題。 – SingleNegationElimination

回答

3

您需要同時安裝Python 2.5和2.7以及byteplay(http://code.google.com/p/byteplay/)。

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) 

用法:

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

當然,由於api的差異,模塊可能會在2.7上運行時引發異常,但是您可以隨時去破解由diz.py –

+0

生成的程序集,但這似乎沒有考慮嵌套代碼對象 – rumpel