捕获dis.dis结果
有没有办法获得输出而dis.dis()
无需重定向sys.stdout
?我试过了:
out=str(dis.dis())
和
out=""""""
out+=str(dis.dis())
但是我很快发现它又回来了None
。有没有什么办法解决这一问题?
-
不幸的是,在3.4之前的Python版本中,该
dis
模块使用print语句进行stdout,因此它不会返回任何直接有用的东西。要么你不得不重新实施dis
,disassemble
和disassemble_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())