# Windows 上多版本 Python：用 py、venv 和绝对路径

> Python 3.11 与 3.12 并存，每个应用独立 venv，固定解释器，不依赖 PATH 或商店别名。

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29

## 一句话结论

用 **py launcher** 选版本，用**每应用 venv** 固定依赖：

```powershell
py -0p
py -3.11 -m venv C:\apps\api-a\.venv
C:\apps\api-a\.venv\Scripts\python.exe -m pip install -r requirements.txt
```

venv 里的 `python.exe` 才是生产选择器。不要依赖 PATH 的 `python`，也不要把应用依赖装到全局。

## 看装了什么

```powershell
py -0p
py -3.11 --version
py -3.12 --version
where.exe python
```

`python` 打开 Microsoft Store，就禁用 App Execution Alias，或用 `py`/绝对路径。商店别名是“Python 不对”的常见来源。

## 每应用 venv

```powershell
py -3.11 -m venv C:\apps\api-a\.venv
C:\apps\api-a\.venv\Scripts\python.exe -m pip install --upgrade pip
C:\apps\api-a\.venv\Scripts\python.exe -m pip install -r C:\apps\api-a\requirements.txt
```

venv 记录基础解释器。重建比调试混在一起的全局 site-packages 便宜。

服务用绝对 venv python：

```text
C:\apps\api-a\.venv\Scripts\python.exe -m waitress --listen=127.0.0.1:8000 app:app
```

## 验证

```powershell
C:\apps\api-a\.venv\Scripts\python.exe -c "import sys; print(sys.executable); print(sys.version)"
C:\apps\api-a\.venv\Scripts\python.exe -m pip list
```

`sys.executable` 应指向应用 venv，不是 `C:\Python311\python.exe`。

## 升级路径

1. 新 Python 装在旧版旁边。
2. 给应用建新 venv（`py -3.12 -m venv .venv312`）。
3. 按 lock/requirements 装依赖，跑测试。
4. 服务路径切到新 venv。
5. 回滚不需要后再删旧 venv。

> **警告: 不要把 venv 跨机器复制**
>
> venv 含绝对路径和基础解释器引用。复制 `requirements.txt`/lockfile 到目标机重建；不要打包搬 `.venv`。

## 实验室边界

E1。实验室没有装多版本 Python 或跑 WSGI 服务；命令是选择器模式，在 Server 2025 上验证。

## 来源

- [Python — Windows 使用](https://docs.python.org/zh-cn/3/using/windows.html)
- [Python — venv](https://docs.python.org/zh-cn/3/library/venv.html)
- [Python — py launcher](https://docs.python.org/zh-cn/3/using/windows.html#python-launcher-for-windows)

---

来源页面: https://winbook.fyi/zh/server/runtimes/python-multi-version/
