为何指定Python3.7的Conda虚拟环境,终端显示Python3.9?
我创建了一个指定Python 3.7版本的Conda虚拟环境,在Anaconda Navigator的Environments中查看该环境时显示Python 3.7,但在终端激活该环境后,执行python --version命令却输出Python 3.9.9。
相关环境信息
- 使用基于Rosetta的Mac OS终端,处理器为Intel x86-64
- Shell为Z-shell(zsh)
终端执行命令
~$conda create -n tf python=3.7 ~$conda activate tf (tf)~$python --version Python 3.9.9
.zshrc文件内容
PROMPT='%n~$' #export CFLAGS="-I//opt/anaconda3/lib/python3.9/site-packages/numpy/core/include" #export PATH="/usr/local/bin:$PATH #alias python_brew=/usr/local/bin/python3 if command -v pyenv 1>/dev/null 2>&1; then eval "$(pyenv init -)" fi # >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then . "/opt/anaconda3/etc/profile.d/conda.sh" else export PATH="/opt/anaconda3/bin:$PATH" fi fi unset __conda_setup # <<< conda initialize <<<
.zprofile文件内容
# sets gcc 11 as default gcc compiler (prevents from Xcode version being used) # alias gcc='gcc-11' # alias cc='gcc-11' # alias g++='g++-11' # alias c++='c++-11' alias nanoz='nano ~/.zshrc' alias zprofile='open ~/.zprofile' export PATH="/usr/local/bin:$PATH" # >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then . "/opt/anaconda3/etc/profile.d/conda.sh" else export PATH="/opt/anaconda3/bin:$PATH" fi fi unset __conda_setup # <<< conda initialize <<< # PYENV if command -v pyenv 1>/dev/null 2>&1; then eval "$(pyenv init -)" fi # End: delete for miniconda3 TensorFlow env to work # Deactivates conda before running brew. # Re-activates conda if it was active upon completion. brew() { local conda_env="$CONDA_DEFAULT_ENV" while [ "$CONDA_SHLVL" -gt 0 ]; do conda deactivate done command brew $@ local brew_status=$? [ -n "${conda_env:+x}" ] && conda activate "$conda_env" return "$brew_status" } #PATH TO MYSQL #export PATH=/usr/local/mysql/bin:$PATH
核心原因
你的终端里python命令被pyenv接管了,pyenv设置的全局Python版本是3.9.9,而且pyenv的初始化顺序在conda之前,导致它修改的PATH优先级更高,覆盖了conda虚拟环境的Python路径。
从配置文件能看到:.zshrc和.zprofile都是先初始化pyenv,再初始化conda,pyenv会把自身管理的Python路径放到PATH最前面,所以激活conda环境后,系统还是优先调用pyenv的Python。
解决步骤
1. 调整初始化顺序
把conda的初始化代码移到pyenv初始化之前,确保conda激活环境时能优先修改PATH。
修改.zshrc和.zprofile,将pyenv的代码块移到conda初始化之后:
# >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then . "/opt/anaconda3/etc/profile.d/conda.sh" else export PATH="/opt/anaconda3/bin:$PATH" fi fi unset __conda_setup # <<< conda initialize <<< # PYENV if command -v pyenv 1>/dev/null 2>&1; then eval "$(pyenv init -)" fi
2. 验证pyenv版本配置
执行以下命令查看pyenv的全局/本地Python版本:
pyenv global pyenv local
如果全局版本是3.9.9,可在激活conda环境后临时执行pyenv local system,让系统优先使用conda的Python;不建议直接修改全局版本,避免影响其他环境。
3. 重启终端
修改配置文件后,关闭并重新打开终端,激活tf环境后再次执行python --version,应该会显示Python 3.7。
4. 额外检查
如果问题仍存在,执行which python查看当前python命令的路径:
(tf)~$which python
正常应该指向/opt/anaconda3/envs/tf/bin/python,如果显示pyenv路径(比如~/.pyenv/shims/python),说明初始化顺序还是有问题,需要重新检查配置文件。
内容的提问来源于stack exchange,提问作者kate

