捕获dis.dis结果

时间:2012-08-24 14:49:11

标签: python python-2.7

有没有办法在没有重定向dis.dis()的情况下获得sys.stdout的输出?我试过了:

out=str(dis.dis())

out=""""""
out+=str(dis.dis())

然而,我很快发现它返回None。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:23)

不幸的是,在3.4之前的Python版本中,dis模块使用了stdout的print语句,所以它不会返回任何直接有用的东西。您必须重新实施disdisassembledisassemble_string函数,或者暂时将sys.stdout替换为捕获输出的替代方法:

import sys
from cStringIO import StringIO

out = StringIO()
stdout = sys.stdout
sys.stdout = out
try:
    dis.dis()
finally:
    sys.stdout = stdout
out = out.getvalue()

这实际上最好使用上下文管理器完成:

import sys
from contextlib import contextmanager
from cStringIO import StringIO

@contextmanager
def captureStdOut(output):
    stdout = sys.stdout
    sys.stdout = output
    try:
        yield
    finally:
        sys.stdout = stdout

out = StringIO()
with captureStdOut(out):
    dis.dis()
print out.getvalue()

这样,即使stdout出现问题,也可以保证dis恢复正常。一点点演示:

>>> out = StringIO()
>>> with captureStdOut(out):
...     dis.dis(captureStdOut)
... 
>>> print out.getvalue()
 83           0 LOAD_GLOBAL              0 (GeneratorContextManager)
              3 LOAD_DEREF               0 (func)
              6 LOAD_FAST                0 (args)
              9 LOAD_FAST                1 (kwds)
             12 CALL_FUNCTION_VAR_KW     0
             15 CALL_FUNCTION            1
             18 RETURN_VALUE        

在Python 3.4及更高版本中,相关函数使用file参数将输出重定向到:

from io import StringIO

with StringIO() as out:
    dis.dis(file=out)
    print(out.getvalue())