[Distutils] namespace_packages: include itself ot not include

Roman Kurakin rik at inse.ru
Tue Feb 8 20:29:42 CET 2011

Sorry for top-posting. Since my model was braked, I'll try to explain the
problem from very beginning. I didn't expect that model is totally wrong :-)

There is a package 'aaa.bbb' that uses setuptool only if it is  installed on
the system. 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.

I started to dig if there is possibility to coexists development and 
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 
even if I know that there would be 'aaa.bbb.ccc'. But if I not list it 
there, I
can ignore egg&pth files, and in my cases setuptool will behave compatible.

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?

Best regards,

P.J. Eby wrote:
> At 01:07 PM 2/8/2011 +0300, Roman Kurakin wrote:
>> P.J. Eby wrote:
>>> At 12:06 AM 2/8/2011 +0300, Roman Kurakin wrote:
>>>> but one is initial provider of 'aaa' share
>>>> and other consumer of 'aaa' share.
>>> This statement is why you're confused.  A namespace is not 
>>> "provided" by anyone, only participated in.
>> No I am confused by practice :-) . The problem I am thinking about is 
>> __init__.py.
>> So __init__.py is my namespace provider I thinking of beside the scene.
> There is no such thing as a namespace provider.  That's why you're 
> confused.  A namespace package is just a namespace for other modules 
> and packages.  It does not have any existence of its own.
>>  The
>> problem I hit was with rpm packages I was playing with. The package 
>> 'aaa.bbb'
>> list itself in namespace_packages and developer states that this is 
>> needed cause
>> there is 'aaa.bbb.ccc' package. In this case, installer drops 
>> __init__.py not only
>> for aaa/__init__.py but also for aaa/bbb/__init__.py. For 'aaa' this 
>> is correct
>> since some one should provide __init__.py for 'aaa' before us.
> You're still confused.  In the RPM case, there will be *no* 
> aaa/__init__.py.
>> But who will
>> provide __init__.py for 'aaa.bbb' if we pack it as setuptool provided 
>> it for us?
> It is not necessary.  Look for a file like 
> "mypackage-version-nspkg.pth" in the directory adjacent to aaa -- you 
> will see that it contains code to make the package exist despite the 
> nonexistence of the __init__.py
>>> Think of it this way.  You and I decide to have lunch together.  I 
>>> am not providing the lunch.  You are not providing the lunch.  But 
>>> we are both participating in the lunch.
>>> That is how namespace packages work.  aaa.bbb participates in the 
>>> aaa namespace, therefore it lists aaa as a namespace package.
>> But what about 'aaa.bbb' that lists itself as a namespace package?
> You are saying, "but what if I provide the lunch?"  You can't provide 
> the lunch.  You can only *join* the lunch.
> You are trying to solve a problem that doesn't exist.  Namespace 
> packages are the names of a *group* of modules or packages.  There is 
> no "main" package for a namespace, and no "extensions".  There is no 
> single project that "provides" the namespace, just like there is no 
> one person who "provides" the lunch.
> If you persist in thinking that there is a provider, then you will 
> continue to be confused, and trying to solve a problem that doesn't 
> actually exist.
>> Should it list itself or not? In case it should, the question is how to
>> deal with __init__.py?
> As it says in the setuptools documentation, you must provide an 
> __init__.py in your project that ONLY contains the namespace 
> registration.  In installation environments that do not require an 
> __init__.py (e.g. rpm installs), this file will NOT be included -- an 
> nspkg.pth file will be used instead.  For .egg files and directories, 
> the __init__.py of every participating project is included, but only 
> the first one found on sys.path will actually be used.
>> That is why I tried to draw such model with providers and extenders.
>> One should make reservation if lunch is planned in some popular place.
> Setuptools handles the reservations.  The project simply says, "I'm 
> with the aaa group", and setuptools says, "ah, then you're sitting 
> over here".  ;-)  If there is nobody else arrived yet, then setuptools 
> takes care of allocating the table, so to speak, and then seats all 
> the newcomers there as well.
> But, just because one person arrives first, doesn't make them the head 
> of the group.  Members of the party may arrive in any order, and when 
> others show up they will be seated in the same place.

More information about the Distutils-SIG mailing list