-
Notifications
You must be signed in to change notification settings - Fork 900
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use sys.path
for package discovery
#9849
base: main
Are you sure you want to change the base?
Conversation
This better reflects the intended behavior of this oject, which is to serve as a database of InstalledPackages rather than a representation of the relevant environment/interpreter path.
sigh Locally, I'm hitting rust-lang/rust-analyzer#16959 trying to diagnose what's happening in the two spots that the most recent commit has added more granular All the tests run via the VS Code UI for debug end up panicking before running with:
Looks like I'll be falling back to using regular |
Doing a brain dump since I need a break now -- it took me a bit of time to separate a bunch of tooling failures/noise, and actually understand what's broken here... uv/crates/uv-virtualenv/src/lib.rs Line 71 in 5903ce5
The virtual environment's An easy reproducer for this, with this PR, is using This used to be fine earlier since the logic didn't care at all about sys.path and the interpreter's prefix was being updated which was effectively "updating" the site-packages path that'd be used for the lookups. Ignoring to update sys.path is not viable, at least, not with the goal of this change of using appropriately using sys.path for package discovery. Still thinking through what to do here... The "slow" option here would be to recreate the |
Ok, an alternative that I haven't fully thought through the implications of... I think this is more of a reasonable guess of what sys.path will be, but it might just work. Here's the idea: Instead of querying the interpreter again, use the ❯ /opt/pradyunsg/bin/python3.12 -S -c "import sys; print(sys.path)"
['', '/opt/pradyunsg/lib/python312.zip', '/opt/pradyunsg/lib/python3.12', '/opt/pradyunsg/lib/python3.12/lib-dynload']
❯ /opt/pradyunsg/bin/python3.12 -c "import sys; print(sys.path)"
['', '/opt/pradyunsg/lib/python312.zip', '/opt/pradyunsg/lib/python3.12', '/opt/pradyunsg/lib/python3.12/lib-dynload', '/opt/pradyunsg/lib/python3.12/site-packages'] Let me know if this seems reasonable, and also... I'd be very happy to hear if someone can think of a scenario where this might be broken! |
Broken might be a bit harsh, but 'incomplete'?
I do note that the former usage is much more common than the latter. If the 'correct' thing to do is unacceptably slow -- and the guess is good enough for most use cases -- maybe an acceptable compromise is to do the 'good enough' thing by default and provide an option for those who really need that extra correctness? |
You won't have these in an environment that was just-created in-process by uv, as I understand it. You could have these in the base environment though, so the "guess" model doesn't work in general for environments with I think that's fine. We could stick with this computational approach for environments with |
Resolves #2500
Intend to resolve #4466 before coming out of draft mode here.
x-ref #2413, since this PR removes an assumption introduced in that PR that a missing site-packages directory means that there are no packages to be found.
Summary
sys.path
rather than inferred paths based onsysconfig
'spurelib
andplatlib
directories.site_packages
we were computing for this is not used anywhere else.Test Plan
Only manually tested as of now.
The plan for automated tests is: Use a
.pth
file as an extra path to be injected to the virtual environment being modified, with the extra path pointing to site-packages from another virtual environment.This should be less complicated than the proposed approaches of using
sitecustomize.py
as well as relying on system-site-packages with a mock system interpreter -- all these approaches modify thesys.path
in a manner visible to the interpreter introspection script and using a.pth
file is likely to be the easiest to reason about.