The following code produces bytecode output as string. I want to replace some lines of the bytecode and reassemble and exec it. Do I need something like the ByteCodeAssember or can I do this with PyCode New?
http://docs.python.org/2/c-api/code.html#PyCode_New
http://pypi.python.org/pypi/BytecodeAssembler
output
********** code **********
type: <type 'str'>
def test(a,b):
return a*b
test(2,3)
********** compiles into the bytecode **********
type: <type 'code'>
1 0 LOAD_CONST 0 (<code object test at 0x101d1ca30, file "<string>", line 1>)
3 MAKE_FUNCTION 0
6 STORE_NAME 0 (test)
3 9 LOAD_NAME 0 (test)
12 LOAD_CONST 1 (2)
15 LOAD_CONST 2 (3)
18 CALL_FUNCTION 2
21 POP_TOP
22 LOAD_CONST 3 (None)
25 RETURN_VALUE 3
********** bytecode **********
'd\x00\x00\x84\x00\x00Z\x00\x00e\x00\x00d\x01\x00d\x02\x00\x83\x02\x00\x01d\x03\x00S'
code
import dis
import sys
import inspect
import new
class writer:
def __init__(self):
self.s = ""
def write(self,text):
#print ': ',text
self.s += text
#save stdout
origstdout = sys.stdout
w = writer()
sys.stdout = w
s = "def test(a,b):\n\treturn a*b\ntest(2,3)"
c = compile(s,'<string>','exec')
# dis calls stdout, so output is in w
bytecode = dis.dis(c)
sys.stdout = origstdout
def h(x):
print '*'*10 + '\t' + x + '\t' + '*'*10 + '\n'*1
h('code')
print 'type: '+str(type(s))
print s + '\n'
h('compiles into the bytecode')
print 'type: '+str(type(c))
print w.s
h('bytecode')
print repr(c.co_code)
Byteplay is a nice wrapper for python code objects. It has its own code class. Code objects is CPython specific and more complicated. To get started certainly better to play with byteplay first.
produces