At 04:35 PM 5/5/2009 -0500, Ian Bicking wrote:
Any ideas on this?Â Phillip?
On Fri, May 1, 2009 at 5:07 PM, Ian Bicking <mailto:firstname.lastname@example.org@colorstudy.com> wrote: So, a bit of a problem came up with pip and namespace packages.Â Here's my understanding of what's going on:
When you install a namespace package with pip, it uses install --single-version-externally-managed, and generally the namespace directory is empty and there's a *.nspkg.pth file that has this:
import sys,new,os; p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('<NAMESPACE>',)); ie = os.path.exists(os.path.join(p,'__init__.py')); m = not ie and sys.modules.setdefault('zope',new.module('zope')); mp = (m or ) and m.__dict__.setdefault('__path__',); (p not in mp) and mp.append(p)
So the lack of an __init__.py file doesn't really matter, because it's created right there, and has its __path__ added to.Â But there's a problem when there's another namespace package elsewhere on the path, that wasn't installed with pip (or Setuptools) and uses pkgutils.extend_path(__path__, __name__).Â This doesn't get imported because of that .pth file, and the .pth file doesn't itself use extend_path, so the path isn't searched.Â This is currently happening with Zope packages installed with plain distutils, then another package installed with the zope namespace elsewhere with pip.Â (When using easy_install, I think pkg_resource.declare_namespace comes into play somewhere, and this seems to handle this case, but I'm not sure why the installation is different with pip.)
So... what should pip be doing differently to make this work?
Heck if I know. IIUC, this should work as long as the namespace declaration gets invoked at some point.
But I don't know of any way to ensure that, except for pip to write its own __init__.py (invoking declare_namespace()) and gets rid of the nspkg.pth file.