wntrblm / nox

Flexible test automation for Python
https://nox.thea.codes
Apache License 2.0
1.3k stars 148 forks source link

Error when running a uv backend session with active conda environment #801

Closed jayqi closed 5 months ago

jayqi commented 5 months ago

Current Behavior

If you have a conda environment active and try to run a session with using uv as a backend and session.install, uv throws an error because it detects both an active conda environment and an active virtual environment:

nox > Command uv pip install ruff failed with exit code 2:
error: Both VIRTUAL_ENV and CONDA_PREFIX are set. Please unset one of them.

Expected Behavior

nox should clear both VIRTUAL_ENV and CONDA_PREFIX environment variables before trying to run a session.

(I am mixing conda environments and virtual environments for a project because my project needs graphviz, which is nice to install with conda. My dev environment is using conda. However, I don't need it for all environments like linting, so it would be nice to be able to use uv for fast sessions.)

Steps To Reproduce

# noxfile.py
import nox

@nox.session(venv_backend="uv")
def lint(session):
    session.install("ruff")
# No conda environment active, no problem
❯ nox -s lint
nox > Running session lint
nox > Creating virtual environment (uv) using python in .nox/lint
nox > uv pip install ruff
nox > Session lint was successful.

# Activate a conda environment, try to run
❯ mamba create -n my-conda-env -y
...redacted for brevity...
❯ mamba activate my-conda-env
❯ nox -s lint
nox > Running session lint
nox > Creating virtual environment (uv) using python in .nox/lint
nox > uv pip install ruff
nox > Command uv pip install ruff failed with exit code 2:
error: Both VIRTUAL_ENV and CONDA_PREFIX are set. Please unset one of them.
nox > Session lint failed.

Environment

- OS: macOS
- Python: 3.12.1
- Nox: 2024.3.2

Anything else?

No response

jayqi commented 5 months ago

It looks like manually unsetting the CONDA_PREFIX environment variable is a workaround, e.g.,

@nox.session(venv_backend="uv")
def lint(session):
    session.env.pop("CONDA_PREFIX")
    session.install("ruff")
jayqi commented 5 months ago

I just saw https://github.com/astral-sh/uv/pull/2574 was released with uv v0.1.23.

This fixes the specific problem I was having. However, I think the opposite case would still be an issue (active venv, nox session uses conda env and user tries to use uv) and would install things into the wrong environment.