如何用conda或virtualenv实现虚拟环境间的Python包共享?
针对你想要在全局Python环境和多个虚拟环境之间选择性共享包文件、避免重复复制,同时又不想像--system-site-packages那样引入所有全局包(导致pip freeze冗余)的需求,我给你整理了几个适配Windows 10 + Python 3.6的可行方案:
一、Virtualenv + 手动软链接方案
这个方案能让你精准控制哪些全局包被共享,完全避开不需要的全局依赖:
创建干净的基础虚拟环境
先创建一个完全独立、不继承任何全局包的虚拟环境:virtualenv --no-site-packages venv_1手动创建全局包的软链接
首先找到你的全局Python 3.6的site-packages路径,默认一般是C:\Python36\Lib\site-packages。然后激活虚拟环境,切换到它的site-packages目录,给需要共享的包创建软链接:# 激活虚拟环境 venv_1\Scripts\activate.bat # 进入虚拟环境的site-packages目录 cd Lib\site-packages # 给全局的A包创建软链接 mklink /D "A" "C:\Python36\Lib\site-packages\A" # 同理创建B、C的链接 mklink /D "B" "C:\Python36\Lib\site-packages\B" mklink /D "C" "C:\Python36\Lib\site-packages\C"这样虚拟环境就会直接使用全局的A、B、C包文件,不会在本地生成副本。之后安装虚拟环境独有的包(比如E)直接用
pip install E即可,它会被安装到虚拟环境自己的目录里。验证与导出环境
此时用pip freeze查看,只会显示你链接的A、B、C,以及虚拟环境独有的E,完全不会出现全局的D这类无关包,完美符合你的导出需求。
二、Conda 原生共享方案
Conda本身就对包共享做了优化,默认会用硬链接(NTFS文件系统支持)复用包缓存,不需要额外操作就能实现你的需求:
在base环境安装共享包
先确保全局的conda base环境已经装好需要共享的包:conda install A B C D -n base创建指定依赖的虚拟环境
创建新环境时,只声明你需要的包即可,conda会自动复用base环境里已有的包文件(版本一致时):# 创建venv_1,安装A、B、C、E conda create -n venv_1 A B C E # 创建venv_2,安装C、D、F conda create -n venv_2 C D F这里base里的A、B、C、D会被对应的虚拟环境通过硬链接共享,而E、F是新安装的,仅属于各自的环境,不会占用额外的磁盘空间。
环境导出
用conda env export -n venv_1导出环境时,只会包含该环境明确安装的包,不会混入base里的其他无关依赖,完全符合你的要求。
三、一些注意事项
- Virtualenv的软链接方案:如果全局包更新,虚拟环境里的包也会同步更新,这适合需要保持包版本一致的场景,但如果项目需要固定版本,建议还是在虚拟环境里单独安装指定版本。
- Conda的硬链接共享:只有当虚拟环境安装的包版本和base环境完全一致时才会共享,如果版本不同,conda会单独下载对应版本的包。
- Windows下创建软链接如果遇到权限问题,右键命令提示符选择「以管理员身份运行」即可解决。
内容的提问来源于stack exchange,提问作者hazrmard

