服务:uv如何扩展支持python3.6.8

结论

uv 本身支持 Python 3.6(你给的策略页:Tier 2 = 3.6 / 3.7 / 3.8 / 3.9「预期可正常工作」,并明确「uv 不支持 3.6 之前的版本」)。缺的不是 uv 的能力,而是制品:uv 内置的托管下载清单里没有 3.6 / 3.7,地板是 3.8。因此「让 uv 支持 3.6.8」= 用 python-downloads-json-url 覆盖内置清单并自备一份 3.6.8 的 install_only 制品;或者在不动清单的前提下,把外部 3.6.8 解释器交给 uv 用。

实测判据:托管清单里没有 3.6

本机 uv 0.11.21 的实测结果(命令与输出原文):

$ uv python list --all-versions | grep -c '3\\.6\\.'
0
$ uv python list --all-versions | grep -oE 'cpython-3\\.[0-9]+\\.[0-9]+' | sort -u -V | head -3
cpython-3.8.2
cpython-3.8.3
cpython-3.8.5
$ grep -c '3\\.6\\.\\|3\\.7\\.' <官方清单 download-metadata.json>
0

后台是 astral 的 python-build-standalone,其构建从 3.8 起;官方与其镜像都不提供 3.6.8 的 tarball。

三个相关变量,别混用

变量作用对 3.6.8
UV_PYTHON_DOWNLOADS_JSON_URL(config:python-downloads-json-url;CLI:uv python install --python-downloads-json-url)整体替换 uv 二进制里硬编码的托管清单,可指向更旧或更新的版本(uv ≥ 0.6.13)✅ 唯一能新增 3.6.8 的口子
UV_PYTHON_INSTALL_MIRROR只替换下载基址(github.com/astral-sh/python-build-standalone/releases/download),适合镜像加速❌ 只能给已存在的版本换源
UV_PYTHON_DOWNLOADS是否允许自动下载(automatic / manual / never)控制开关,不解决有无

官方环境变量参考对第一个的原文:Managed Python installations information is hardcoded in the uv binary. This variable can be set to a local path or URL pointing to a JSON list of Python installations to override the hardcoded list. This allows customizing the URLs for downloads or using slightly older or newer versions of Python than the ones hardcoded into this build of uv.

机制已在本机跑通(含失败面)

造一份只含 3.6.8 条目的清单,指向一个并不存在的本地 tarball,实测:

$ UV_PYTHON_DOWNLOADS_JSON_URL=file:///tmp/meta36.json uv python list --all-versions
cpython-3.13.15-linux-x86_64-gnu  /run/current-system/sw/bin/python3.13 ...
cpython-3.6.8-linux-x86_64-gnu    <download available>        ← 3.6.8 被列出
 
$ UV_PYTHON_DOWNLOADS_JSON_URL=file:///tmp/meta36.json uv python install 3.6.8
error: Failed to install cpython-3.6.8-linux-x86_64-gnu
  Caused by: failed to query metadata of file `/s500data/pybuild/cpython-3.6.8+..._install_only.tar.gz`:
             No such file or directory (os error 2)

第二段说明链路已通:uv 确实按自定义清单里的 URL 去取制品,只差制品本身(URL 与 sha256 是我编的占位)。

自定义清单的形状

抄自 uv 仓库真实文件 crates/uv-python-managed/download-metadata.json:扁平对象,key 为 <name>-<版本>-<os>-<arch>-<libc>,value 字段如下:

{
  "cpython-3.6.8-linux-x86_64-gnu": {
    "name": "cpython",
    "arch": { "family": "x86_64", "variant": null },
    "os": "linux", "libc": "gnu",
    "major": 3, "minor": 6, "patch": 8, "prerelease": "",
    "url": "file:///s500data/pybuild/cpython-3.6.8%2B20260601-x86_64-unknown-linux-gnu-install_only_stripped.tar.gz",
    "sha256": "<tarball 的 sha256>",
    "variant": null,
    "build": "20260601"
  }
}

url 支持 file:// 与 http(s);sha256 必填且会被校验。

关键坑:清单是全量覆盖,不是追加

实测确认:只含 3.6.8 的清单生效后,uv python list 里所有 <download available> 全部消失(只剩已装好的 3.14.7 / 3.13.15),即 3.10–3.14 之后都不能再下载。正确做法是「官方清单 + 3.6.8 条目」合并成一份本地 JSON:

curl -s -o /s500data/uv/official.json \\
  https://raw.githubusercontent.com/astral-sh/uv/main/crates/uv-python-managed/download-metadata.json
python3 - <<'PY'
import json
m = json.load(open('/s500data/uv/official.json'))
m["cpython-3.6.8-linux-x86_64-gnu"] = { ...上面的条目... }
json.dump(m, open('/s500data/uv/python-downloads.json','w'), indent=1)
PY
sha256sum /s500data/pybuild/cpython-3.6.8*.tar.gz     # 填回 sha256 字段

路线一:托管式(uv 自己装 3.6.8)

前提:先自己产出一份 3.6.8 的 PBS 风格 install_only 制品(bin/ lib/ include/ 布局的 tarball)。最省事的产法是容器:docker run python:3.6.8-slim 后把 /usr/local 捞出来打包;在容器里用 pyenv 编 3.6.8 亦可(3.6 需要 OpenSSL 1.1,直接在 NixOS 上编很麻烦)。

接入 activate.sh:在 /etc/nixos/scripts/activate.sh 顶部 UV_ENV_HOME 那一段旁边加一行(幂等,可重复 source):

export UV_PYTHON_DOWNLOADS_JSON_URL="${UV_PYTHON_DOWNLOADS_JSON_URL:-/s500data/uv/python-downloads.json}"

之后你原有的 activate <名称> 3.6.8 会照旧走 uv venv --python 3.6.8,uv 从自定义清单取制品。

路线二:非托管式(借用外部 3.6.8 解释器)

不动清单也能用 3.6.8:uv 的发现顺序是「UV_PYTHON_INSTALL_DIR 里的托管安装 → PATH →(Windows 注册表)」,所以把外部解释器挂进去即可:

export UV_PYTHON_SEARCH_PATH=/opt/py368/bin
uv venv --python /opt/py368/bin/python3.6 /s500data/envs/py368

可在 activate.sh 里加一条分支:版本号形如 3.6.* 时优先用外部解释器,别去撞 uv 的托管清单。

本机实况

项实测值
uv/run/current-system/sw/bin/uv,0.11.21
uv 托管清单地板cpython-3.8.2
nixpkgs python36无(no python36)
conda / pyenv均未安装
代理出网需 127.0.0.1:7890(拉官方清单时已用)

复核命令

# 清单里是否已有 3.6
uv python list --all-versions | grep -E '3\\.6\\.|3\\.7\\.'
 
# 自定义清单是否生效
UV_PYTHON_DOWNLOADS_JSON_URL=file:///s500data/uv/python-downloads.json uv python list | grep 3.6.8
 
# 真正安装(需制品 URL 可访问、sha256 正确)
UV_PYTHON_DOWNLOADS_JSON_URL=file:///s500data/uv/python-downloads.json uv python install 3.6.8
 
# 建环境
uv venv --python 3.6.8 /s500data/envs/py368 && /s500data/envs/py368/bin/python -V

未完成 / 待验证

  • 3.6.8 的 install_only 制品尚未产出,清单里的 url 与 sha256 目前是占位值;uv python install 3.6.8 到「取制品」这一步会失败,这是预期的。
  • activate.sh 尚未修改(只读未动)。
  • 3.6.8 建 venv 后的 pip/依赖兼容性未验证(3.6 已 EOL,很多包无对应 wheel)。