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.
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.
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
'a bakabilirsiniz. modülü, 2.7'de çalıştırıldığında istisnalar artırabilir ancak daha sonra diz.py –
tarafından üretilen montajı kesebilir ve kesebilirsiniz. Bu, yuvalanmış kod nesnelerini hesaba katmıyor gibi gözükmez. – rumpel
Neden? 2.5'in 2.7 ile uyumlu bayt kodu değil mi? –
Bahse girerim. Tam bayt kodu formatı genellikle bir uygulama detayıdır ve taşınabilir olması beklenmemektedir. – delnan
+1; Bunun iyi bir fikir olup olmadığını bilmiyorum, ama ilginç bir soru. – SingleNegationElimination