有沒有辦法在不重定向的情況下獲得dis.dis()
的輸出sys.stdout
?我曾嘗試:捕獲dis.dis結果
out=str(dis.dis())
和
out=""""""
out+=str(dis.dis())
但是我很快發現它返回None
。有沒有什麼辦法解決這一問題?
有沒有辦法在不重定向的情況下獲得dis.dis()
的輸出sys.stdout
?我曾嘗試:捕獲dis.dis結果
out=str(dis.dis())
和
out=""""""
out+=str(dis.dis())
但是我很快發現它返回None
。有沒有什麼辦法解決這一問題?
不幸的是,在3.4之前的Python版本中,dis
模塊使用print語句輸出stdout,所以它不會返回任何直接有用的東西。要麼你必須重新實現dis
,disassemble
和disassemble_string
功能,或者你暫時用其他功能代替sys.stdout
捕獲輸出:
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()
:
import sys
from cStringIO import StringIO
out = StringIO()
stdout = sys.stdout
sys.stdout = out
try:
dis.dis()
finally:
sys.stdout = stdout
out = 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.get_value())
爲什麼你不希望將stdout(暫時),如[這個問題](http://stackoverflow.com/questions/1218933/can-i-redirect-the-stdout-in-python-into-some-sort-of-string-buffer)? –
對於Python 3.4或更高版本,還有其他解決方案。請參閱[此問題](http://stackoverflow.com/q/31347044/3004881)。 –