Reputation: 6438
Is there any way to get the output of dis.dis()
without redirecting sys.stdout
? I have tried:
out=str(dis.dis())
and
out=""""""
out+=str(dis.dis())
However I soon found out that it returns None
. Is there any way to fix this?
Upvotes: 20
Views: 3301
Reputation: 2738
If using Colab / Jupyter
In one cell you can run dis
redirecting the output to a variable
%%capture dis_output
# dis : Disassembler for Python bytecode
from dis import dis
dis(function_to_check)
And then you can use it from Bash. Here an example
! 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)
Or from Python
print(dis_output.stdout)
Upvotes: 0
Reputation: 1123770
Unfortunately, in Python versions before 3.4 the dis
module uses print statements to stdout, so it won't return anything directly useful. Either you have to re-implement the dis
, disassemble
and disassemble_string
functions, or you temporarily replace sys.stdout
with an alternative to capture the output:
import sys
from cStringIO import StringIO
out = StringIO()
stdout = sys.stdout
sys.stdout = out
try:
dis.dis()
finally:
sys.stdout = stdout
out = out.getvalue()
This is actually best done using a context manager:
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()
That way you are guaranteed to have stdout
restored even if something goes wrong with dis
. A little demonstration:
>>> 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
In Python 3.4 and up, the relevant functions take a file
parameter to redirect output to:
from io import StringIO
with StringIO() as out:
dis.dis(file=out)
print(out.getvalue())
Upvotes: 29