On Mon, 4 Jul 2005 13:01:06 -0500, Jeff Epler <je****@unpythonic.net> 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(propri etary_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