17

dis.dis()リダイレクトせずに出力を取得する方法はありますsys.stdoutか? 私が試してみました:

out=str(dis.dis())

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

しかし、すぐに戻ってくることがわかりましたNone。これを修正する方法はありますか?

4

2 に答える 2

24

残念ながら、3.4 より前のバージョンの Python では、disモジュールは print ステートメントを stdout に使用するため、直接有用なものは返されません。disdisassembleおよび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()

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        

Python 3.4 以降では、関連する関数はfileパラメーターを使用して出力をリダイレクトします。

from io import StringIO

with StringIO() as out:
    dis.dis(file=out)
    print(out.getvalue())
于 2012-08-24T14:55:30.417 に答える
0

Colab / Jupyter を使用する場合

dis1 つのセルで、出力を変数にリダイレクトして実行できます

%%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)
于 2022-02-15T16:54:00.873 に答える