【问题标题】:capturing dis.dis results捕获 dis.dis 结果
【发布时间】:2012-08-20 03:42:45
【问题描述】:

有什么方法可以在不重定向sys.stdout 的情况下获得dis.dis() 的输出?我试过了:

out=str(dis.dis())

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

但是我很快发现它返回了None。有没有办法解决这个问题?

【问题讨论】:

  • 你为什么不想重定向标准输出(暂时),就像this question一样?
  • 对于 Python 3.4 或更高版本,还有其他解决方案。见this question

标签: python python-2.7


【解决方案1】:

不幸的是,在 3.4 之前的 Python 版本中,dis 模块使用打印语句到标准输出,因此它不会返回任何直接有用的东西。要么您必须重新实现 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()

这样即使dis 出现问题,您也可以保证恢复stdout。一个小示范:

>>> 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())

【讨论】:

  • (+1) :在这里使用上下文管理器是天才。漂亮。
  • 我认为在大多数情况下你不需要保存sys.stdout,你可以使用sys._stdout来恢复它。
  • @agf: 假定 sys.stdout 尚未被替换。sys.__stdout__sys.stdout默认 值,但这并不意味着 sys.stdout 当前设置为该值。
  • @MartijnPieters 我知道,这就是我说“在大多数情况下”的原因。
  • @agf:在编写通用代码时,您也需要考虑那些极端情况。SO 上的答案中的代码被全部复制,所以我尝试编写可以使用的东西 全部结束。 :-)
猜你喜欢
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2022-06-24
  • 1970-01-01
相关资源
最近更新 更多