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:i...@colorstudy.com>i...@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.
_______________________________________________
Distutils-SIG maillist - Distutils-SIG@python.org
http://mail.python.org/mailman/listinfo/distutils-sig