有没有办法在不重定向sys.stdout的情况下获得dis.dis()的输出?我试过了:
out=str(dis.dis())和
out=""""""
out+=str(dis.dis())然而,我很快就发现它返回的是None。有没有办法解决这个问题?
发布于 2012-08-24 22:55:30
不幸的是,在Python3.4之前的版本中,dis模块使用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()这样,即使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 在Python3.4及更高版本中,相关函数采用file参数将输出重定向到:
from io import StringIO
with StringIO() as out:
dis.dis(file=out)
print(out.getvalue())发布于 2022-02-15 16:54:01
如果使用Colab / Jupyter
在一个单元格中,您可以运行dis,将输出重定向到变量
%%capture dis_output
# dis : Disassembler for Python bytecode
from dis import dis
dis(function_to_check)然后你可以在Bash中使用它。下面是一个示例
! 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
print(dis_output.stdout)https://stackoverflow.com/questions/12111717
复制相似问题