真香定律?
不知道是 pdm 和 micromamba 搭配有问题,还是和 conda 系搭配有问题,有时候安装依赖会莫名其妙报错,网上搜索也没有相关资料,甚至 pyprojcet.toml 里给 ruff 指定 pylint 规则也会报错。
看 uv 介绍未来路线还打算支持类似 pyenv 和 poetry 之类的工具,所以还是决定试试 uv:
Think: a single binary that bootstraps your Python installation and gives you everything you need to be productive with Python, bundling not only
pip,pip-tools, andvirtualenv, but alsopipx,tox,poetry,pyenv,ruff, and more.
然后我决定来试试这个。
默认 uv 使用系统内已有的 Python 版本,因为系统版本一般都比较老,且 uv 使用 conda 中的 python 环境(通过当前激活的 conda 环境设置的 CONDA_PREFIX 读取),所以我还是继续使用 micromamba,或许后面会换成 miniconda。
安装
下面是 Linux/Mac 的安装命令,使用 pip 也能装,但这里就不演示了。
curl -LsSf https://astral.sh/uv/install.sh | sh
别名设置
感觉 uv pip 还是太长了,而且总给我一种它内置了 pip 的感觉,所以我给这个命令设置了别名:
alias up='uv pip'
这样就舒服多了。
依赖
安装依赖
小贴士
命令可能会访问网络,如果当前网络不好,需要访问 pypi 镜像站点的话,可以使用
--index-url参数。或是在环境变量中设置UV_INDEX_URL使得可以自动使用镜像战点。
uv pip install fastapi
生成依赖
小贴士
命令可能会访问网络,如果当前网络不好,需要访问 pypi 镜像站点的话,可以使用
--index-url参数。或是在环境变量中设置UV_INDEX_URL使得可以自动使用镜像战点。
下面列出从各个来源生成依赖的方式:
-
从当前环境生成:
uv pip freeze | uv pip compile - -o requirements.txt -
从 requirements.in:
uv pip compile requirements.in -o requirements.txt -
从 pyproject.toml:
uv pip compile pyproject.toml -o requirements.txt -
从 setup.py:
uv pip compile setup.py -o requirements.txt -
传递依赖名称:
echo flask | uv pip compile - -o requirements.txt
依赖同步
小贴士
命令可能会访问网络,如果当前网络不好,需要访问 pypi 镜像站点的话,可以使用
--index-url参数。或是在环境变量中设置UV_INDEX_URL使得可以自动使用镜像战点。
如果要让当前环境与依赖文件中的同步,则使用如下命令:
uv pip sync requirements.txt
如果要同步多个文件中的依赖,可以直接在后面加:
uv pip sync requirements.txt requirements.prod.txt
环境变量
小贴士
至目前版本(0.1.27),环境变量的值都可以在使用命令时指定参数进行替代。
UV_INDEX_URL: 相当于--index-url命令行参数。如果设置,uv 将使用此 URL 作为搜索包的基本索引。UV_EXTRA_INDEX_URL: 相当于--extra-index-url命令行参数。如果设置,uv 将在搜索包时使用此空格分隔的 URL 列表作为附加索引。UV_CACHE_DIR: 相当于--cache-dir命令行参数。如果设置,uv 将使用此目录进行缓存,而不是默认的缓存目录。UV_NO_CACHE: 相当于--no-cache命令行参数。如果设置,uv 将不会使用缓存进行任何操作。在 Dockerfile 可以用的上。UV_RESOLUTION: 相当于--resolution命令行参数。例如,如果设置为lowest-direct,uv 将安装所有直接依赖项的最低兼容版本。UV_PRERELEASE: 相当于--prerelease命令行参数。例如,如果设置为allow,uv 将允许所有依赖项的预发布版本。UV_SYSTEM_PYTHON: 相当于--system命令行参数。如果设置为true,uv 将使用系统中找到的第一个 Python 解释器PATH。UV_NATIVE_TLS: 相当于--native-tls命令行参数。如果设置为true,uv 将使用系统的信任存储而不是捆绑的webpki-rootscrate。
警告
UV_SYSTEM_PYTHON=true适用于持续集成 (CI) 环境,应谨慎使用,因为它可能会修改系统 Python 安装。感觉可能也可以用在 Dockerfile 里。
还有一些其他的环境变量就不介绍了。
上手
我是先创建一个 conda 环境,然后再激活这个 conda 环境,然后使用 uv:
mkdir myprojcet
cd myprojcet
conda create -p ./.venv -yq python=3.11
conda activate ./.venv
uv pip install fastapi
感觉目前这个项目还是太早期了,依赖还有环境管理虽然都有计划但目前都还没实现,就在个人项目里玩玩吧。