From f87c29e3262da54ade38151efb814646b812a0fc Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Fri, 16 Feb 2024 12:55:24 -0600 Subject: [PATCH] Automatically detect virtual environments when used via `python -m uv` (#1504) Closes https://github.com/astral-sh/uv/issues/1501 --- python/uv/__main__.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/python/uv/__main__.py b/python/uv/__main__.py index 5fea6a3e7..975a72941 100644 --- a/python/uv/__main__.py +++ b/python/uv/__main__.py @@ -3,6 +3,25 @@ import sys import sysconfig +def detect_virtualenv() -> str: + """ + Find the virtual environment path for the current Python executable. + """ + + # If it's already set, then just use it + value = os.getenv("VIRTUAL_ENV") + if value: + return value + + # Otherwise, check if we're in a venv + venv_marker = os.path.join(sys.prefix, "pyvenv.cfg") + + if os.path.exists(venv_marker): + return sys.prefix + + return "" + + def find_uv_bin() -> str: """Return the uv binary path.""" @@ -30,10 +49,16 @@ def find_uv_bin() -> str: if __name__ == "__main__": uv = os.fsdecode(find_uv_bin()) + + env = {} + venv = detect_virtualenv() + if venv: + env["VIRTUAL_ENV"] = venv + if sys.platform == "win32": import subprocess - completed_process = subprocess.run([uv, *sys.argv[1:]]) + completed_process = subprocess.run([uv, *sys.argv[1:]], env=env) sys.exit(completed_process.returncode) else: - os.execvp(uv, [uv, *sys.argv[1:]]) + os.execvpe(uv, [uv, *sys.argv[1:]], env=env)