mirror of
https://github.com/astral-sh/uv.git
synced 2025-07-07 21:35:00 +00:00

Closes #2222 Closes https://github.com/astral-sh/uv/issues/2058 Replaces https://github.com/astral-sh/uv/pull/2338 See also https://github.com/astral-sh/uv/issues/2649 We use an environment variable (`UV_INTERNAL__PARENT_INTERPRETER`) to track the invoking interpreter when `python -m uv` is used. The parent interpreter is preferred over all other sources (though it will be skipped if it does not meet a `--python` request or if `--system` is used and it belongs to a virtual environment). We warn if `--system` is not provided and this interpreter would mutate system packages, but allow it.
47 lines
1 KiB
Python
47 lines
1 KiB
Python
import os
|
|
import sys
|
|
|
|
from uv import find_uv_bin
|
|
|
|
|
|
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 _run() -> None:
|
|
uv = os.fsdecode(find_uv_bin())
|
|
|
|
env = os.environ.copy()
|
|
venv = _detect_virtualenv()
|
|
if venv:
|
|
env.setdefault("VIRTUAL_ENV", venv)
|
|
|
|
# Let `uv` know that it was spawned by this Python interpreter
|
|
env["UV_INTERNAL__PARENT_INTERPRETER"] = sys.executable
|
|
|
|
if sys.platform == "win32":
|
|
import subprocess
|
|
|
|
completed_process = subprocess.run([uv, *sys.argv[1:]], env=env)
|
|
sys.exit(completed_process.returncode)
|
|
else:
|
|
os.execvpe(uv, [uv, *sys.argv[1:]], env=env)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
_run()
|