有没有办法在没有重定向dis.dis()
的情况下获得sys.stdout
的输出?我试过了:
out=str(dis.dis())
和
out=""""""
out+=str(dis.dis())
然而,我很快发现它返回None
。有什么方法可以解决这个问题吗?
答案 0 :(得分:23)
不幸的是,在3.4之前的Python版本中,dis
模块使用了stdout的print语句,所以它不会返回任何直接有用的东西。您必须重新实施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())