IT *_*nja 15 python python-2.7
有没有办法在dis.dis()没有重定向的情况下获得输出sys.stdout?我试过了:
out=str(dis.dis())
Run Code Online (Sandbox Code Playgroud)
和
out=""""""
out+=str(dis.dis())
Run Code Online (Sandbox Code Playgroud)
但是我很快发现它又回来了None.有没有什么办法解决这一问题?
Mar*_*ers 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()
Run Code Online (Sandbox Code Playgroud)
这实际上最好使用上下文管理器完成:
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()
Run Code Online (Sandbox Code Playgroud)
这样,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
Run Code Online (Sandbox Code Playgroud)
在Python 3.4及更高版本中,相关函数采用file参数将输出重定向到:
from io import StringIO
with StringIO() as out:
dis.dis(file=out)
print(out.getvalue())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1529 次 |
| 最近记录: |