在 Windows 绿色版 Python(embeddable)上让多个解释器共享同一个 PyPI 仓库

作者:高恩阳
日期:2025-06-25


一、要解决的问题

  1. 官方 Windows embeddable package(64-bit)不带 venv,也不会写注册表,就是单纯一个 python.exe + python310.zip
  2. 我想在同一台机器上放好几份这样的绿色解释器(不同目录、不同副本),但它们都要用 PyTorch、Numpy 等巨型库
  3. 如果每份解释器都 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_directorytorch\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 及其依赖就能“一次安装、到处运行”,再也不用重复吃磁盘。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐