
On Wed, Oct 21, 2020 at 6:30 AM Paul Moore <p.f.moore@gmail.com> wrote:
On Tue, 20 Oct 2020 at 20:16, Chris Angelico <rosuav@gmail.com> wrote:
What's the mechanism by which a venv announces its parent, and does this work correctly if the binary is invoked directly? Currently, if you invoke /.../.../.../env/bin/python3, it will use the lib directory from that venv; with this plan, it would need to add the parent also.
I'd imagine that the "parent" could be put in `pyvenv.cfg`, and the interpreter startup code would (somehow) add that to `sys.path`. Which is mostly straightforward, but `sys.path` setup is (I believe) fairly deeply entangled with interpreter startup. I'd assume that the effect of the mechanism would be just like any other means of adding entries to sys.path - that's both the intended layering benefits, and the potentially bad/confusing ones like different versions of a package shadowing each other.
That's what I'd have figured too, but interpreter startup does make it more complicated.
It's also worth noting that tools like pip would probably struggle with managing linked environments like this. I suspect that's actually a far bigger problem than the core mechanism. Pip is already struggling with the amount of complexity it has to deal with, I don't think we'd be able to add something like this. So you might have to manually manage the "layers", or build a tool that wraps pip and handles the layering.
There's already the --system-site-packages flag to venv; I'm not sure how pip behaves with that - does "pip freeze" list system-installed packages too? Whatever it is, I would just assume that the parent venv is between the current one and the system path, with similar behaviour. What happens if the parent has a parent? What happens if you create circular parentage (by changing the config file on the parent to have the child as a parent - a classic time travel paradox)? Assuming these edge cases can be resolved in some well-defined way (even if that's "throw an error if you try that"), I'm +1 on this proposal. ChrisA