Import weirdness

Remy C. Cool dev-python at smartology.nl
Thu Jun 3 06:02:41 EDT 2004


Hello,

A couple of months ago, I posted a question related to the same 
problem, but didn't get any replies. I've created a ugly workaround 
but still would like to get some insight on the matter.

Case:

XMLRPC client imports modules and packages from a XMLRPC server.

Method used:

path_hooks
See PEP302 - http://www.python.org/peps/pep-0302.html

Basic layout of the importer class:

class RemoteImporter:

    def __init__(self, path):
        self.path = path   
        if path.split('.')[0] not in self.pathlist:
            raise ImportError
        
    def find_module(self, fullname, path=None):
        print 'FIND MODULE:', fullname
	self.package, self.code = self.server.import(fullname)
	if self.code:
	   self.request_path = fullname.split('.')
	   return self
        
    def load_module(self, fullname):
        print 'LOAD MODULE:', fullname 
	path = self._get_code(fullname)
	# create new module
        mod = imp.new_module(fullname)
        mod.__file__   = "<%s>" % fullname
        mod.__loader__ = self
        mod.__path__   = path
        # register with sys.modules
        sys.modules[fullname] = mod
        # exec
        exec self.code in mod.__dict__
	return mod

    def _get_code(self, fullname):
        if len(self.request_path) > 1:
	    _fname = '.'.join(self.request_path[0:-1])
            return self._get_subfile(fname, self.request_path[-1])
	    del fname
        else:
            return self._get_archive(self.request_path[-1])

    def _get_archive(self, modname):
        # assemble path
        if self.package:
            path = ["%s" % self.fullname]
        else:
            path = []
        # return results
        return path

    def _get_subfile(self, parent, modname):
        # assemble path
        if self.package:
            path = ["%s.%s" % (parent, modname)]
        else:
            path = []
        # return results
        return path


Note: pathlist contains ie: ['mymodules', 'RemoteImporter']

In the xmlrpc client app I have: import mymodules

The package mymodules get's imported and modules contained in 
mymodules wil also be imported. One of the problems is that when I 
want to import modules in other modules contained in the package. 

Example:

mymodules
    __init__.py 
    module_1.py
    module_2.py
    module_3.py

When I use the line: 'import module_2' in module_1.py, the 'fullname' 
as printed by find_module is not mymodules.module_2 but only 
module_2. Without the base, the module can't be found. It is solvable 
by prefixing imports with 'mymodules' like 'import 
mymodules.module_2', but that is not a portable solution since the 
name 'mymodules' could change. 

Is this behavour a bug?

< Remy > 







More information about the Python-list mailing list