From db356ab8d4ca6a60e2cb326999e22100ff742c96 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Sat, 21 Jun 2025 06:47:44 -0500 Subject: [PATCH] Update `find_uv_bin` to locate uv in the base prefix --- python/uv/_find_uv.py | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/python/uv/_find_uv.py b/python/uv/_find_uv.py index 00b7d8873..0c45aff1a 100644 --- a/python/uv/_find_uv.py +++ b/python/uv/_find_uv.py @@ -10,20 +10,21 @@ def find_uv_bin() -> str: uv_exe = "uv" + sysconfig.get_config_var("EXE") + # Search in the scripts directory for the current prefix path = os.path.join(sysconfig.get_path("scripts"), uv_exe) if os.path.isfile(path): return path - if sys.version_info >= (3, 10): - user_scheme = sysconfig.get_preferred_scheme("user") - elif os.name == "nt": - user_scheme = "nt_user" - elif sys.platform == "darwin" and sys._framework: - user_scheme = "osx_framework_user" - else: - user_scheme = "posix_user" + # If in a virtual environment, also search in the base prefix's scripts directory + if sys.prefix != sys.base_prefix: + path = os.path.join( + sysconfig.get_path("scripts", vars={"base": sys.base_prefix}), uv_exe + ) + if os.path.isfile(path): + return path - path = os.path.join(sysconfig.get_path("scripts", scheme=user_scheme), uv_exe) + # Search in the user scheme scripts directory, e.g., `~/.local/bin` + path = os.path.join(sysconfig.get_path("scripts", scheme=_user_scheme()), uv_exe) if os.path.isfile(path): return path @@ -34,3 +35,15 @@ def find_uv_bin() -> str: return target_path raise FileNotFoundError(path) + + +def _user_scheme() -> str: + if sys.version_info >= (3, 10): + user_scheme = sysconfig.get_preferred_scheme("user") + elif os.name == "nt": + user_scheme = "nt_user" + elif sys.platform == "darwin" and sys._framework: + user_scheme = "osx_framework_user" + else: + user_scheme = "posix_user" + return user_scheme