2011-10-05 6 views
12

Python 2.5 ile yapılan bazı .pyc dosyalarını Python 2.7 ile nasıl yeniden derleyebilirim?Python 2.5 bayt kodunu 2.7'ye nasıl yeniden derlerim?

Kaynak dosyam yok ve onu alamıyorum.

Ücretsiz bir çözüm arıyorum.

+2

Neden? 2.5'in 2.7 ile uyumlu bayt kodu değil mi? –

+1

Bahse girerim. Tam bayt kodu formatı genellikle bir uygulama detayıdır ve taşınabilir olması beklenmemektedir. – delnan

+1

+1; Bunun iyi bir fikir olup olmadığını bilmiyorum, ama ilginç bir soru. – SingleNegationElimination

cevap

3

Her ikisine de Python 2.5 ve 2.7 ve byteplay (http://code.google.com/p/byteplay/) yüklemeniz gerekir.

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) 

kullanımı:

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

'a bakabilirsiniz. modülü, 2.7'de çalıştırıldığında istisnalar artırabilir ancak daha sonra diz.py –

+0

tarafından üretilen montajı kesebilir ve kesebilirsiniz. Bu, yuvalanmış kod nesnelerini hesaba katmıyor gibi gözükmez. – rumpel