首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获dis.dis结果

捕获dis.dis结果
EN

Stack Overflow用户
提问于 2012-08-24 22:49:11
回答 2查看 2.2K关注 0票数 16

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

代码语言:javascript
复制
out=str(dis.dis())

代码语言:javascript
复制
out=""""""
out+=str(dis.dis())

然而,我很快就发现它返回的是None。有没有办法解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-24 22:55:30

不幸的是,在Python3.4之前的版本中,dis模块使用print语句来输出标准输出,所以它不会直接返回任何有用的东西。您要么必须重新实现disdisassembledisassemble_string函数,要么临时将sys.stdout替换为捕获输出的替代方法:

代码语言:javascript
复制
import sys
from cStringIO import StringIO

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

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

代码语言:javascript
复制
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。下面是一个小演示:

代码语言:javascript
复制
>>> 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        

在Python3.4及更高版本中,相关函数采用file参数将输出重定向到:

代码语言:javascript
复制
from io import StringIO

with StringIO() as out:
    dis.dis(file=out)
    print(out.getvalue())
票数 24
EN

Stack Overflow用户

发布于 2022-02-15 16:54:01

如果使用Colab / Jupyter

在一个单元格中,您可以运行dis,将输出重定向到变量

代码语言:javascript
复制
%%capture dis_output
# dis : Disassembler for Python bytecode
from dis import dis
dis(function_to_check)

然后你可以在Bash中使用它。下面是一个示例

代码语言:javascript
复制
! echo  "{dis_output.stdout}" | grep -i global

14           4 LOAD_GLOBAL              0 (AudioLibrary)
             36 LOAD_GLOBAL              2 (userLanguageAudio)
             50 LOAD_GLOBAL              2 (userLanguageAudio)
             62 LOAD_GLOBAL              3 (LESSON_FILES_DIR)
 27          76 LOAD_GLOBAL              4 (get_ipython)
 30          96 LOAD_GLOBAL              6 (pread)
 31         104 LOAD_GLOBAL              7 (print)
 34     >>  124 LOAD_GLOBAL              7 (print)

或者来自Python

代码语言:javascript
复制
print(dis_output.stdout)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12111717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档