升级Mac OS Monterey后virtualenvwrapper异常及Python版本路径问题求助
一、为什么virtualenvwrapper用了Cellar的Python而非你指定的路径?
这里主要有两个核心原因:
virtualenv本身的版本绑定问题
你配置的VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv这个工具,大概率是用Cellar里的Python3.7安装的。virtualenv在安装时会和安装它的Python版本绑定,默认创建虚拟环境时就会优先使用这个绑定版本,哪怕你设置了VIRTUALENVWRAPPER_PYTHON也会被它覆盖。你可以验证这个点:查看virtualenv的shebang行
cat /usr/local/bin/virtualenv如果第一行显示类似
#!/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/bin/python3.7,那问题就出在这儿。Shell配置文件未正确加载
MacOS Monterey默认Shell是zsh,而你把virtualenvwrapper的配置写在了.bash_profile里。如果你的终端用的是zsh,这个文件不会自动加载,导致VIRTUALENVWRAPPER_PYTHON等环境变量根本没生效。
对应的解决步骤:
重新绑定virtualenv到正确的Python版本
先卸载旧的virtualenv,用你指定的/usr/local/bin/python3重新安装:pip3 uninstall virtualenv -y /usr/local/bin/python3 -m pip install virtualenv这样新的virtualenv就会和你想要的Python版本绑定,创建虚拟环境时会默认使用该版本。
确保Shell配置生效
如果用的是默认的zsh,把.bash_profile里的配置复制到~/.zshrc,或者在~/.zshrc末尾加一行:source ~/.bash_profile然后重启终端,或者执行
source ~/.zshrc让配置立即生效。临时应急方案:创建虚拟环境时强制指定Python
如果你不想马上重装virtualenv,可以在创建命令里手动指定版本:mkvirtualenv --python=/usr/local/bin/python3 venvname
二、关于Monterey的Python版本疑问
你说的没错,MacOS Monterey自带的Python3版本确实是3.8.9,但它的路径是/System/Library/Frameworks/Python.framework/Versions/3.8/bin/python3。你执行python3 --version显示3.7.3,是因为Homebrew安装的Python3.7在你的PATH里优先级更高。
Homebrew会把安装的软件放在/usr/local/bin,而系统自带的Python在/usr/bin,通常你的PATH环境变量里/usr/local/bin排在/usr/bin前面,所以终端会优先调用Homebrew的Python版本。
系统升级后的相关变更:
- 默认Shell切换为zsh:之前的bash配置文件(
.bash_profile、.bashrc)不再自动加载,需要迁移到zsh的配置文件(.zshrc)。 - 系统Python版本升级到3.8.9:Apple对系统自带的Python做了更严格的权限保护,不建议直接修改或替换,避免破坏系统自带功能。
- PATH优先级调整:第三方工具安装目录(如
/usr/local/bin)的优先级高于系统目录,确保用户自行安装的工具优先被调用。
内容的提问来源于stack exchange,提问作者T. Rossi

