On Feb 9, 2007, at 12:08 PM, Phillip J. Eby wrote:
At 09:15 AM 2/9/2007 -0500, Jim Fulton wrote:
The question is whether a less annoying layout can be made importable.
Well, what's "annoying" is relative. I personally find the flat layout "annoying" because it's not WYSIWYG. :)
But the answer to your question is "yes". Anything can be made importable, with sufficient effort.
When a project that includes a namespace package is installed using --single-version-externally-managed, a special .pth file for that project is created that sets up empty modules in sys.modules with appropriate __path__ values.
I really don't fathom --single-version-externally-managed. :)
Where is this .pth file created?
A similar technique could be applied in setup.py develop, if a project uses package_dirs. I'm just a bit reluctant to try to shoehorn something like that into 0.6.
But, if you'd like to experiment with creating a patch (or a subclass of "develop") that would support creating and uninstalling this .pth file, see the 'install_namespaces()' method of the install_egg_info command in setuptools. The code you'd need for this would actually be *simpler* in some ways, because that code is trying to work relative to whatever directory it's installed in, but for what "develop" needs you could just bake the absolute paths right in.
What would read this .pth file?
The uninstall mode of "develop" could just remove the .pth file. One possible complication, however, is that if someone didn't uninstall but left the .pth file around, it would produce strange results (if e.g., they installed an egg for the project without uninstalling the develop mode). So, the code in the .pth should probably check that the original project is still on sys.path before creating dummy modules.
I kinda doubt I understand this enough to pursue it. In any case, I won't have time until after PyCon. I may ask you more about this there (assuming that you'll be there.)