Python3是否支持嵌套venv?能否访问多个虚拟环境的已安装包?
问题解答
一、Python 3 嵌套venv相关问题
- Python 3 原生venv模块不支持真正意义上的“嵌套虚拟环境”。如果在已激活的venv中执行
python -m venv 新环境名,生成的新虚拟环境仍是完全独立的实体,和父级venv没有从属关系。 - 默认情况下,新创建的venv不会继承任何父环境/系统环境的已安装包,只有在创建时添加
--system-site-packages参数,才可以读取系统级(或当前激活的父级环境)的site-packages内容,即便如此也不属于嵌套,只是开启了跨环境包读取权限。
二、conda与venv叠加激活的原理和包访问问题
运行原理
虚拟环境的激活本质是修改当前shell的两个核心环境变量:
PATH变量:会将当前激活环境的bin目录放到PATH的最靠前位置,让shell优先调用该环境下的可执行文件PS1变量:即shell命令提示符,激活脚本会把环境标识追加到提示符最前面,不会清空之前已添加的环境标识
你先激活conda环境时,conda已经修改了PATH和PS1,之后再激活原生venv时,venv的激活脚本只会把自己的bin目录放到PATH最前面,同时把(venv)标识追加到PS1开头,所以就出现了两个环境标识同时显示、但默认调用的是最后激活的venv中Python的现象。
包访问说明
默认状态下不能同时访问两个环境的软件包:
Python运行时查找第三方包的路径是由当前使用的Python解释器的内置配置决定的,你当前调用的是venv中的Python,默认只会读取venv自身目录下的site-packages文件夹中的内容,不会主动读取conda环境的包路径。如果需要访问conda环境的包,需要手动修改PYTHONPATH环境变量,将conda环境的site-packages路径加入到检索列表中,但该操作容易引发依赖版本冲突,非常不推荐。
注意:叠加激活不同虚拟环境的操作存在很高的环境混乱风险,建议使用时先退出前一个虚拟环境,再激活新的环境。
内容的提问来源于stack exchange,提问作者chitharthan
相关产品推荐
相关产品推荐

