2012-08-24 63 views
12

有沒有辦法在不重定向的情況下獲得dis.dis()的輸出sys.stdout?我曾嘗試:捕獲dis.dis結果

out=str(dis.dis()) 

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

但是我很快發現它返回None。有沒有什麼辦法解決這一問題?

+0

爲什麼你不希望將stdout(暫時),如[這個問題](http://stackoverflow.com/questions/1218933/can-i-redirect-the-stdout-in-python-into-some-sort-of-string-buffer)? –

+0

對於Python 3.4或更高版本,還有其他解決方案。請參閱[此問題](http://stackoverflow.com/q/31347044/3004881)。 –

回答

21

不幸的是,在3.4之前的Python版本中,dis模塊使用print語句輸出stdout,所以它不會返回任何直接有用的東西。要麼你必須重新實現disdisassembledisassemble_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()) 
+0

(+1):這裏使用上下文管理器是天才。美麗。 – mgilson

+0

在大多數情況下,我不認爲你需要保存'sys.stdout',你可以使用'sys._stdout'來恢復它。 – agf

+0

@agf:假定sys.stdout沒有被替換.. sys.__ stdout__是sys.stdout的默認值,但這並不意味着sys.stdout是當前*設置爲該值。 –