Getting a module's byte code, how?
Steve Holden
steve at holdenweb.com
Wed Feb 2 18:02:39 EST 2005
Irmen de Jong wrote:
> Steve Holden wrote:
>
>> 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:
>
>
> Yup. As I explained in the other message, this is basically
> what I'm doing at the moment (with a few twists; it reads the .py
> file if no .pyc is available).
> But I also want the bytecode of modules that don't have a .pyc file,
> possibly because they have already been 'dynamically' loaded from
> another bytecode string ;-)
>
Aah, right, I suspect in these cases (which *are* pretty far from the
ordinary run of things) you'd sometimes be up the creek without a paddle.
> Now, I could ofcourse store the bytecode string that I started
> with *inside* the module itself, in a special attribute or so.
> This just occurred to me and I think it's a possible solution.
> But the bytecodes must be stored by Python itself somewhere
> already... because Python is able to execute my module... right?
Not necessarily. I've just been playing with importing modules from a
database. Here's the relevant extract from my load_module() function:
code, package, path = row # ... from the database
code = marshal.loads(code)
module = DBmodule(modname) # subclass of moduleType
sys.modules[modname] = module
module.__name__ = modname
module.__file__ = path # "db:%s" % modname
module.__loader__ = dbimporter
if package:
module.__path__ = ["*db*"]
exec code in module.__dict__
#print modname, "loaded:", module, "pkg:", package
return module
Note well that the module is essentially imported by executing its
bytecode in the context of the module's directory. From that point on
the module doesn't need access to its code - all its functions and
classes have been created, and the functions and methods reachable from
the module's __dict__ now have appropriate snippets of the byte code as
their own code objects.
> I want them! :-)
>
Well I'm afraid there's no guarantee that they haven't already been
garbage collected, and stamping your foot isn't going to do any good :-)
>> Note that the ugly details *might* change, and that byte codes are
>> version-dependent.
>
>
> I know, but this fact was not yet mentioned in the Pyro manual.
> Thanks for reminding me, I'll add it.
>
> --Irmen
A pleasure. Thanks for Pyro! (and thanks for reminding me indirectly
that I need to guard that execution of hte module's code against
exceptions).
regards
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