[Python-Dev] imputil and modulefinder replacements (original) (raw)

Gordon McMillan gmcm@hypernet.com
Fri, 5 Oct 2001 15:20:32 -0400


[James C. Ahlstrom]

My interest in imputil and ImportManager is to implement jar files, and neither does this well. The problem is always how to get the SpecialImporter.py imported first, and how to hack the imports that the SpecialImporter.py may need to import. In iu4.py we see the use of posix.stat to replace the os module, and the import of only built-in modules sys, imp, and marshal. The same is true of imputil.py.

Here's my bootstrap code (archive_rt knows how to import from .pyz archives):

import archive_rt, iu4 iu4._globalownertypes.insert(0, archive_rt.PYZOwner) iu4.ImportManager().install()

Now a .pyz on sys.path will be searched. Nothing hard about doing this for a .zip. MacPython & Jython do it.

I admit I don't really understand package imports. But I feel they are an unsolved problem, because package authors always seem to write custom ones.

Most of what I see is namespace trickery, not custom importers.

A first-class solution would have these features IMHO: 1) Access to libraries in zip files is implemented in C (I volunteer). 2) All Python library modules can be imported by C code, either from directories or zip files.

With Thomas's changes to PyImport_ImportModuleEx, this is largely taken care of (it gets routed through import). So with the above bootstrap code, C code will import from my .pyz as well.

3) Package import is not implemented in C, it is implemented by a Python module which is part of the standard library.

The rules aren't documented, but the essentials are pretty straightforward. I'd like to see them changed to draw a distinction between relative imports and absolute imports (since that's a constant source of gotcha's).

However, there are import hacks out there that rely on undocumented (and probably accidental) features of implementation.

4) If an import of A.B is attempted, and a function A.MyCustomImporter() exists, then that is used instead of the default.

In iu4, A is welcome to take over all imports below A. If A.init does not do so, the standard mechanism is used.

5) More or better ideas from you all.