(sorry for the stupid previous early send)
Just to recap:
1. if you don’t put namespace_packages in the setup.py, then it will uninstall the shared __init__.py when you uninstall any of the packages
Right. You need to declare the namespace in setup.py.
2. If you put namespace_packages, then there is a pth file created for the shared directory (site-packages/foo) and no foo/__init__.py is created (even if it is in your package)
Correct. That is exactly the behavior that’s expected. There can be many packages in the namespace (e.g., zope.* or zope.app.*) and they all share the namespace, but none of them owns that __init__.py. That’s why it’s not installed there and is replaced with a *.pth file.
#2 - breaks things like : doing a source checkout that participates in this namespace_package…If you do this then only the lib/site-packages/foo/<modules> are importable
Again, it’s not clear what are you referring to?
Are you doing a source checkout over your installed packages / virtual environment?
I sure hope not.
You can use pip —editable for adding your source checkouts to virtual environment or installed packages.
If you use build tools (such as zc.buildout) and install your packages, they will end up over several egg / wheel directories “parallel” to each other, but the proper namespace declaration will ensure that they are all importable. You cannot even do the source checkout over such an installation.
It looks like you are trying to find a workaround for the problem that perhaps is not a problem at all if you use the standard approach properly.
Solution appears to be:
create a standalone “foo" package that has ONLY the shared __init__.py, and do NOT set "namespace_packages" .
No, that is not the solution. That’s a sure way to break the namespace in the egg/wheel based installations.
This seems to associate the __init__.py with the “foo” tool, so that only when you uninstall the "foo" tool does the __init__.py get uninstalled.
Why do you worry so much about uninstalling __init__.py.
If it’s not there (and it isn’t with properly declared namespaces) why does it matter?
It also has the shared __init__.py in lib/site-packages, so it seems that enables the other namespace packages that are source checkouts or added to path via other methods.
What other methods?
The key here is to make decision how do you want to install your packages?
Pick one and use it instead fighting the tooling.
Hopefully this works long term, and maybe is useful to someone else out there….
I doubt it,
It’s an incorrect advice.