以下代码将字节码输出生成为字符串。我想替换一些字节码行并重新组装并执行它。我是否需要 ByteCodeAssember 之类的东西,或者我可以使用 PyCode New 来做到这一点?
http://docs.python.org/2/c-api/code.html#PyCode_New
http://pypi.python.org/pypi/BytecodeAssembler
输出
********** 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'
代码
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)