为何Homebrew安装的pipenv venv依赖丢失及改名后有重复残留包
问题根本原因
- 通过Homebrew安装的pipenv默认不会在项目文件夹内部创建虚拟环境,所有项目对应的venv会统一存储在全局公共目录下,每个venv的命名规则为「项目名称-项目绝对路径哈希值」,pipenv依靠这套命名规则自动匹配和当前项目路径绑定的虚拟环境。
- 修改项目文件夹名称后,项目的绝对路径发生变更,对应的路径哈希值同步改变,pipenv无法找到和新路径匹配的旧虚拟环境,会在你执行
pipenv shell时自动新建一个空白虚拟环境。 - 这就解释了为什么执行
which python3、which pip3返回路径符合venv特征,但pip3 list仅显示pip、setuptools、wheel三个基础包的现象——当前激活的并非之前装载了项目依赖的旧venv,是pipenv自动生成的全新空白环境。 - 整个过程中旧的虚拟环境不会被pipenv自动删除,它只是因为路径不匹配,再也不会被pipenv自动关联加载。
旧残留包的具体位置
- macOS下pipenv存储虚拟环境的根目录有两个常见路径:
- 通用路径:
~/.local/share/virtualenvs/ - Homebrew安装版本对应的缓存路径:
~/Library/Caches/virtualenvs/
- 通用路径:
- 执行
pipenv --venv可以查看当前新激活的venv路径,同目录下其余和当前项目名相关、体积明显更大(存储了全部旧依赖)的文件夹,就是没有被关联的旧残留venv。 - 旧venv内所有此前安装的依赖包都会完整保留,不会因为你重新在新venv中安装依赖而自动同步或清理,属于完全独立的残留文件。
- 确认不需要保留旧venv内容时,可以直接手动删除对应文件夹释放存储空间,不会对当前正在使用的新venv造成影响。
内容的提问来源于stack exchange,提问作者AlexZ
相关产品推荐
相关产品推荐

