Getting a module's byte code, how?

Steve Holden steve at holdenweb.com
Wed Feb 2 17:26:30 EST 2005


Mark Nenadov wrote:

> On Wed, 02 Feb 2005 23:03:17 +0100, Irmen de Jong wrote:
> 
> 
>>What would be the best way, if any, to obtain
>>the bytecode for a given loaded module?
>>
>>I can get the source:
>>import inspect
>>import os
>>src = inspect.getsource(os)
>>
>>but there is no ispect.getbytecode()  ;-)
>>
>>--Irmen
> 
> 
> The inspect API documentation says that code objects have "co_code", which
> is a string of raw compiled bytecode.
> 
> Hope that helps!
> 
Unfortunately co_code is an attribute of code objects, and a module 
doesn't *have* a code object, as far as I know - when it's imported its 
bytecode is executed in the scope of the module directory, but no 
attempt is made to keep the code around thereafter: what would be the point?

Having said which, if the module was loaded from a .pyc file then the 
bytecode is available from that - take everything but the first eight 
bytes and use marshal.loads() to turn it back into a code object:

  >>> mbc = file("/lib/python2.4/re.pyc", "rb").read()[8:]
  >>> import marshal
  >>> code = marshal.loads(mbc)
  >>> code
<code object ? at 0xa085d60, file 
"/tmp/python.2568/usr/lib/python2.4/re.py", line 1>
  >>>

Note that the ugly details *might* change, and that byte codes are 
version-dependent.

tadaaa-ly y'rs  - steve
-- 
Meet the Python developers and your c.l.py favorites March 23-25
Come to PyCon DC 2005          http://www.python.org/pycon/2005/
Steve Holden                           http://www.holdenweb.com/



More information about the Python-list mailing list