On Mon, 4 Jul 2005 13:01:06 -0500, Jeff Epler <[EMAIL PROTECTED]> wrote:

>
>--s2ZSL+KKDSLx8OML
>Content-Type: text/plain; charset=us-ascii
>Content-Disposition: inline
>
>This stupid code works for modules, but not for packages.  It probably has 
>bugs.
>
>
>import marshal, types
>
>class StringImporter:
>    def __init__(self, old_import, modules):
>        self._import = old_import
>        self._modules = modules
>
>    def __call__(self, name, *args):
>        module = self._modules.get(name, None)
>        if module is None:
>            return self._import(name, *args)
>        code = marshal.loads(module)
>        mod = types.ModuleType(name)
>        exec code in mod.__dict__
>        return mod
>
>def test():
>    import __builtin__
>    __builtin__.__import__ = StringImporter(__builtin__.__import__,
>        { 'test_importer': open("/usr/lib/python2.3/os.pyc").read()[8:] })
>
>    import test_importer
>    print test_importer.path.join("a", "b")
>    print test_importer.__doc__
>
>if __name__ == '__main__': test()

I have a feeling that the OP might be looking for a way to convert
source -> source, e.g., (sketch only, not even remotely tested ;-)

    # main.py
    import some_module
    import another

into

    # main.py
    # prelim
    import marshal, sys        #  builtin
    ModuleType = type(__builtins__) # avoid import types
    def unscramble_proprietary_format(proprietary_string):
        # ... whatever
    def extract_code(proprietary_string):
        return marshal.loads(unscramble_proprietary_format(proprietary_string))

    # replacing each import with
    try: some_module = sys.modules['some_module']  # don't re-"import"
    except KeyError:
        some_module = ModuleType('some_module')
        exec extract_code(
             "< ... string literal for proprietarily scrambled marshalled 
module body code"
             " generated by source -> source rewrite utility ... >"
             ) in some_module.__dict__
        sys.modules['some_module'] = some_module

    try: another = sys.modules['another']
    except NameError:
        another = ModuleType('another')
        exec extract_code('<proprietary marshalled code string for module 
source another.py>')
        sys.modules['another'] = another

    # etc

so that his some_module and another scripts can be pre-compiled by the rewrite 
utility and embedded in
a single source (e.g. main.py) so that he doesn't have to have external .pyc 
file accesses.

His startup will then still cost the execs, but not the compiles, and if he 
doesn't "import" stuff
he doesn't need, until he needs it, it should spread the import time load, if 
so desired.

All the proprietary string literal sources should become efficiently 
represented as part of the
single main.pyc IWT, assuming at least that one is used. Chasing various forms 
of import of
non-builtins recursively to eliminate imports in imported modules before they 
are converted to
marshalled form etc., all to avoid real imports, and statically determining 
that some imports
don't need to be converted to marshalled string import form because a prior 
import can be proved,
should be an interesting exercise, which I can't pursue at this point... ;-)

But I may be reading too much between the lines ;-)

Regards,
Bengt Richter
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to