让 uv 直接使用 conda 的环境

在 python 开发的时候有时候可能需要 conda 来安装一些 C++ 的库。一般来说,我个人就简单使用 conda + pip 了。但这次,我希望同时借助 uv 来实现现代化的项目管理。本来是考虑 pixi 的,但是国内还是没有完整的 pixi 镜像源,网络访问总是会有一些问题。所以最后是考虑 conda + uv 来做。

那就有一个问题, uv 总是会自己创建环境,而不是直接操作 conda 的环境。我还想结合 VSCode 去用,它又只能选一个环境。总不能每次都手动去切换,所以还是研究了一下怎么可以让他们共享。

其实解决的办法说出来不麻烦,就是配置一下 UV_PROJECT_ENVIRONMENT , uv 就会直接用给定的环境了。当然了,这个环境变量总不能每次都手动改,那一个办法是在 conda 的 activate.d 里面去配置。

下面是一个完整的示例(假定已安装 conda ,不需要先安装 uv ):

第一步、创建 conda 环境

conda create -n uv_test python=3.13
conda activate uv_test

第二步、安装 uv

# 我这边是在 `uv_test` 这个环境里安装
# 其实全局装可能更好,反正原理是靠环境变量改变 uv 的行为
# 反倒是在环境里安装,会有 uv sync 把 uv 自己卸载的风险,但实际发现好像是会避免的,所以都可以
pip install uv

第三步、配置 activate.d

这可以使得在 conda activate uv_test 时,自动将 UV_PROJECT_ENVIRONMENT 设置为 CONDA_PREFIX 。为了能够在 deactivate 的时候还原,还需要额外记录一下当前值:

# 注意是在 uv_test 这个环境里执行,否则 $CONDA_PREFIX/etc/conda/activate.d 的位置不是这个环境的

(
  _OLD_UV_PROJECT_ENVIRONMENT="_OLD_UV_PROJECT_ENVIRONMENT_$(uuidgen | tr -d '-')"

  mkdir -p "$CONDA_PREFIX/etc/conda/activate.d"
  cat <<EOF > "$CONDA_PREFIX/etc/conda/activate.d/uv_project_environment.sh"
if [ ! -z "\${UV_PROJECT_ENVIRONMENT+x}" ]; then
    export $_OLD_UV_PROJECT_ENVIRONMENT="\$UV_PROJECT_ENVIRONMENT"
fi
export UV_PROJECT_ENVIRONMENT="\$CONDA_PREFIX"
EOF

  mkdir -p "$CONDA_PREFIX/etc/conda/deactivate.d"
  cat <<EOF > "$CONDA_PREFIX/etc/conda/deactivate.d/uv_project_environment.sh"
if [ ! -z "\${$_OLD_UV_PROJECT_ENVIRONMENT+x}" ]; then
    export UV_PROJECT_ENVIRONMENT="\${$_OLD_UV_PROJECT_ENVIRONMENT}"
    unset $_OLD_UV_PROJECT_ENVIRONMENT
else
    unset UV_PROJECT_ENVIRONMENT
fi
EOF
)

# 重新进入环境,让创建的脚本得到执行
conda deactivate
conda activate uv_test

这两个命令比较复杂,写完后可以检查一下 $CONDA_PREFIX/etc/conda/activate.d/uv_project_environment.sh 文件和 $CONDA_PREFIX/etc/conda/deactivate.d/uv_project_environment.sh 文件内容是不是正确。

第四步、开用!

uv init uv_test
cd uv_test
uv add csharp-like-file

ls -a  # 这里没有出现 .venv
uv pip show csharp-like-file  # 安装的包确实出现在 conda 环境里

另外记录一下解决的过程,其实这个 UV_PROJECT_ENVIRONMENT 很难找。官方文档列出了一堆环境变量,根本不知道该用哪个。后面本来想转到 Poetry 看看,发现人家就是直接有 virtualenvs.create 的。但是我又懒得搞了,直接拿这个当关键词一搜,没想到发现这样一个 issue : https://github.com/astral-sh/uv/issues/6459 ,里面提到了 UV_PROJECT_ENVIRONMENT ,成功解决。

另外如果 activate.d 嫌麻烦,其实可以直接

alias uvc='UV_PROJECT_ENVIRONMENT="$CONDA_PREFIX" uv'

不过万一不小心该用 uvc 的地方用了 uv 就要哭了(

posted @ 2026-01-24 22:22  yueyinqiu  阅读(4)  评论(0)    收藏  举报