在 Windows 绿色版 Python(embeddable)上让多个解释器共享同一个 PyPI 仓库
·
在 Windows 绿色版 Python(embeddable)上让多个解释器共享同一个 PyPI 仓库
作者:高恩阳
日期:2025-06-25
一、要解决的问题
- 官方 Windows embeddable package(64-bit)不带 venv,也不会写注册表,就是单纯一个
python.exe+python310.zip。 - 我想在同一台机器上放好几份这样的绿色解释器(不同目录、不同副本),但它们都要用 PyTorch、Numpy 等巨型库。
- 如果每份解释器都
pip install一遍,磁盘瞬间吃掉十几 GB,升级时还得重复 N 次,既占空间又容易版本漂移。
需求:
“让任意多份绿色解释器共用唯一一份第三方库,装/升级一次,所有实例立即生效。”
二、问题分析
| 关键点 | 说明 |
|---|---|
embeddable 没有 site-packages 概念 | 默认只认 python310.zip 和当前目录,不会自动导入任何外部库。 |
没有 venv | 无法通过 python -m venv 创建虚拟环境,只能手动“指哪打哪”。 |
| pip 需要额外安装 | 官方 zip 里连 ensurepip 都没有,得自己跑 get-pip.py。 |
| 依赖完整性 | PyTorch 本身 200+ MB,外加 sympy, networkx, jinja2, mpmath 等十几个依赖,必须一次装齐并且运行期能找到 DLL。 |
结论:
只要
① 把“唯一库目录”写进运行时 sys.path;
② 用同版本解释器;
③ 保证 DLL 搜索路径;
就能达到“多 exe → 一库”的目标。
三、具体解决办法
下面所有命令以 Python 3.10 64-bit embeddable 为例,路径可随意改。
1. 目录规划(示例)
D:\PyGreen\
├─ py310_1\ # 第 1 份解释器
├─ py310_2\ # 第 2 份解释器
├─ py310_3\ # 第 3 份解释器
└─ CommonLib\
└─ site-packages\ # 统一仓库
2. 给任意一份解释器装上 pip
# 下载 get-pip.py
Invoke-WebRequest -Uri https://bootstrap.pypa.io/get-pip.py -OutFile D:\PyGreen\get-pip.py
# 安装 pip(目标指向公共库,这样 Scripts 也集中)
D:\PyGreen\py310_1\python.exe get-pip.py --no-warn-script-location -t D:\PyGreen\CommonLib\site-packages
装完后把 D:\PyGreen\CommonLib\site-packages\Scripts 加入系统 PATH,以后只用这一份 pip。
3. 一次性把 PyTorch + 依赖全装进公共仓库
# CUDA 11.8 版示例,CPU 版把 cu118 换成 cpu 即可
D:\PyGreen\py310_1\python.exe -m pip install `
torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 `
--target D:\PyGreen\CommonLib\site-packages
pip 会自动解析依赖,所有轮子(包括 sympy, networkx, jinja2…)和对应的 *.dist-info 都落到 CommonLib\site-packages。
4. 让每份解释器“认识”公共仓库
进入每个 py310_n\ 目录,编辑 python310._pth(文件名随版本),改成三行:
python310.zip
.
..\CommonLib\site-packages
注意
- 路径相对于
_pth文件所在目录,可写绝对路径。 - 不要留空行,不要加
import site除非你真的需要 site 模块。
5. DLL 搜索路径(仅 PyTorch 需要)
Python ≥3.8 时,torch 的 __init__.py 已用 os.add_dll_directory 把 torch\lib 加入搜索列表,无需手动处理。
若你坚持用 3.7 及更早,可在主脚本开头加:
import os, sys, pathlib
os.add_dll_directory(
pathlib.Path(__file__).with_name('torch') / 'lib'
)
6. 验证
D:\PyGreen\py310_2\python.exe - <<EOF
import torch, sys, pprint
print(torch.__version__)
print(torch.cuda.is_available())
pprint.pprint([p for p in sys.path if 'CommonLib' in p])
EOF
三份解释器输出一致,磁盘只有一份 2 GB+ 的 torch。
四、常见疑问
| 问题 | 回答 |
|---|---|
| 不同项目需要不同 torch 版本怎么办? | 再建一套 CommonLib_v2\site-packages 并改对应 _pth 即可。 |
| 升级库会破环其他项目吗? | 会,这是共享仓库的设计初衷;需要隔离就再分仓库。 |
| 可以混用 32/64 位解释器吗? | 绝对不行,轮子 ABI 不兼容。 |
| 可以把公共仓库放网络盘吗? | 可以,但启动时会有 I/O 延迟,建议 SSD 本地盘。 |
五、一句话总结
把 embeddable 解释器当“绿色启动器”,所有实例共用一份 CommonLib\site-packages,装库时 pip install --target 公共路径,再在 python310._pth 里加一行路径,PyTorch 及其依赖就能“一次安装、到处运行”,再也不用重复吃磁盘。
更多推荐


所有评论(0)