How to fully disassemble Python source

前端 未结 2 1569
被撕碎了的回忆
被撕碎了的回忆 2021-02-03 13:47

I have been playing with the dis library to disassemble some Python source code, but I see that this does not recurse into functions or classes:

imp         


        
2条回答
  •  无人共我
    2021-02-03 14:34

    Late answer but I would have been glad to find it when needed. If you want to fully disassemble a script with functions without importing it, you have to implement the sub_byte_code function mentioned in the question. This is done by scanning byte_code.co_consts to find types.CodeType literals.

    The following completes the script from the question:

    import dis
    import types
    
    source_py = "test.py"
    
    with open(source_py) as f_source:
        source_code = f_source.read()
    
    byte_code = compile(source_code, source_py, "exec")
    dis.dis(byte_code)
    
    for x in byte_code.co_consts:
        if isinstance(x, types.CodeType):
            sub_byte_code = x
            func_name = sub_byte_code.co_name
            print('\nDisassembly of %s:' % func_name)
            dis.dis(sub_byte_code)
    

    And the result will be something like that:

      1           0 LOAD_CONST               0 ()
                  2 LOAD_CONST               1 ('foo')
                  4 MAKE_FUNCTION            0
                  6 STORE_NAME               0 (foo)
    
      4           8 LOAD_NAME                0 (foo)
                 10 LOAD_CONST               2 (42)
                 12 CALL_FUNCTION            1
                 14 STORE_NAME               1 (x)
                 16 LOAD_CONST               3 (None)
                 18 RETURN_VALUE
    
    Disassembly of foo:
      2           0 LOAD_FAST                0 (n)
                  2 UNARY_NEGATIVE
                  4 RETURN_VALUE
    

    Edit: starting from python 3.7, dis.dis disassembles functions and does this recursively. dis.dis has a depth additional argument to control the depth of function definitions to be disassembled.

提交回复
热议问题