From 2fad82c73507293762115cfa431fdb59db192d87 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 4 Feb 2025 17:32:47 -0500 Subject: [PATCH] Set base executable when returning virtual environment (#11209) ## Summary I'm not sure that this has much of an effect in practice, but currently, when we return a virtual environment, the `sys_base_executable ` of the parent ends up being retained as `sys_base_executable` of the created environment. But these can be, like, subtly different? If you have a symlink to a Python, then for the symlink, `sys_base_executable` will be equal to `sys_executable`. But when you create a virtual environment for that interpreter, we'll set `home` to the resolved symlink, and so `sys_base_executable` will be the resolved symlink too, in general. Anyway, this means that we should now have a consistent value between (1) returning `Virtualenv` from the creation routine and (2) querying the created interpreter. --- crates/uv-python/src/interpreter.rs | 1 + crates/uv-python/src/virtualenv.rs | 3 +++ crates/uv-virtualenv/src/virtualenv.rs | 1 + 3 files changed, 5 insertions(+) diff --git a/crates/uv-python/src/interpreter.rs b/crates/uv-python/src/interpreter.rs index cc733b49a..8c6cc22a3 100644 --- a/crates/uv-python/src/interpreter.rs +++ b/crates/uv-python/src/interpreter.rs @@ -94,6 +94,7 @@ impl Interpreter { pub fn with_virtualenv(self, virtualenv: VirtualEnvironment) -> Self { Self { scheme: virtualenv.scheme, + sys_base_executable: Some(virtualenv.base_executable), sys_executable: virtualenv.executable, sys_prefix: virtualenv.root, target: None, diff --git a/crates/uv-python/src/virtualenv.rs b/crates/uv-python/src/virtualenv.rs index 5fdfc094f..2463d1a87 100644 --- a/crates/uv-python/src/virtualenv.rs +++ b/crates/uv-python/src/virtualenv.rs @@ -18,6 +18,9 @@ pub struct VirtualEnvironment { /// (Unix, Python 3.11). pub executable: PathBuf, + /// The path to the base executable for the environment, within the `home` directory. + pub base_executable: PathBuf, + /// The [`Scheme`] paths for the virtualenv, as returned by (e.g.) `sysconfig.get_paths()`. pub scheme: Scheme, } diff --git a/crates/uv-virtualenv/src/virtualenv.rs b/crates/uv-virtualenv/src/virtualenv.rs index bdd5b7ef3..890142bf1 100644 --- a/crates/uv-virtualenv/src/virtualenv.rs +++ b/crates/uv-virtualenv/src/virtualenv.rs @@ -400,6 +400,7 @@ pub(crate) fn create( }, root: location, executable, + base_executable: base_python, }) }