[Distutils] namespace_packages: include itself ot not include
P.J. Eby
pje at telecommunity.com
Wed Feb 9 05:09:44 CET 2011
At 10:29 PM 2/8/2011 +0300, Roman Kurakin wrote:
>There is a package 'aaa.bbb' that uses setuptool only if it is installed on
>the system.
In that case, it can't sensibly use setuptools namespace
packages. At all. You need to either:
1. always use setuptools
2. use an alternate namespace package mechanism (such as
pkgutil.extend_path()), and not declare the namespace
3. Not use namespace packages at all
>This is useful for development, but this breaks rpm build
>process cause it expects __init__.py and doesn't expect egg and pth,
>more over it ignores them. So in my case there is no egg & pth.
The nspkg.pth file is for non-egg installs. If you have an egg,
there is no nspkg.pth file for that package.
>I started to dig if there is possibility to coexists development and rpmbuild
>processes on the same system without very messy spec file. I didn't find
>the strict requirements for the package to list itself in a namespace_package
>even if I know that there would be 'aaa.bbb.ccc'.
It is a requirement for consistent and correct runtime behavior
across all installation targets. (The installation targets are .egg
file, .egg-directory, and non-egg (e.g. rpm))
>So probably question does it break something if package 'aaa.bbb'
>wouldn't list itself in a namespace_package? And does it provide something
>useful if package 'aaa.bbb' would?
To make sure we're clear: if aaa.bbb is actually a namespace -- that
is, if it has separately-installable contents -- then you MUST
declare it if you want consistently correct runtime behavior.
If you do not declare it, then there are some environments where it
will appear to work, and there will be other (superficially
identical) environments where some part of the namespace will
mysteriously fail to be importable.
In other words, the rules are there for a reason. These limitations
are the nature of Python 2.x's import machinery, which was not
originally designed with namespace packages in mind.
There is a namespace package PEP that (in principle) provides a
better mechanism than what setuptools does, but implementation
progress is currently stalled, and the PEP has not been
accepted. So, your options at the present time for separately
installed parts of a namespace package are as I have described.
There is a pure distutils approach you can use that allows partially
installed packages to exist, but it is somewhat fragile and is not
setuptools compatible. It requires that there be a "provider" of a
package, in the sense that exactly one project contains the
__init__.py for the package. But it is fragile because it may not be
supported on all platforms and build targets, and it requires that
aaa.bbb be always installed before aaa.bbb.ccc.... but of course the
distutils by themselves have no dependency mechanism to enforce this.
More information about the Distutils-SIG
mailing list