WSL下Ubuntu 22.04虚拟环境python命令版本异常问题咨询
问题分析与解决
问题现象
在WSL Ubuntu 22.04中,用virtualenvwrapper创建Python3.8虚拟环境38env,激活后PATH已将虚拟环境bin目录置于最前:
- 原PATH:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/username/.local/bin - 激活后PATH:
/home/username/.venvs/38env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/username/.local/bin
虚拟环境bin目录下的Python链接均指向3.8版本:
(38env) username@DEVICE:~/.venvs/38env/bin$ ls -l |grep python -rwxr-xr-x 1 username username 248 Jan 14 06:40 ipython -rwxr-xr-x 1 username username 248 Jan 14 06:40 ipython3 lrwxrwxrwx 1 username username 9 Jan 13 12:16 python -> python3.8 lrwxrwxrwx 1 username username 9 Jan 13 12:16 python3 -> python3.8 lrwxrwxrwx 1 username username 40 Jan 13 12:16 python3.8 -> /home/username/.localpython/bin/python3.8
激活环境后,which python显示路径为虚拟环境的python,但执行python -V却返回系统3.10版本,直接执行虚拟环境路径的python则返回3.8版本:
(38env) username@DEVICE:~$ which python /home/username/.venvs/38env/bin/python (38env) username@DEVICE:~$ python -V Python 3.10.12 (38env) username@DEVICE:~$ /home/username/.venvs/38env/bin/python -V Python 3.8.3
原因
这是Shell命令哈希缓存导致的:
- Bash等Shell会记录你最近执行过的命令路径到哈希表中,避免每次遍历PATH查找,提升执行效率。
- 你在激活虚拟环境前执行过
python命令,Shell缓存了/usr/bin/python的路径;激活环境后PATH更新,但Shell仍优先使用缓存的旧路径,而非重新遍历新PATH查找。 python3未出现此问题,大概率是因为激活环境前你没执行过python3,或者它的缓存已过期。
可执行以下命令验证缓存:
hash python
输出会显示Shell缓存的python命令路径,应为/usr/bin/python。
解决办法
方法1:清除单个命令的哈希缓存
执行命令删除python的缓存记录:
hash -d python
之后再执行python -V就会使用PATH中虚拟环境的版本。
方法2:清除所有命令的哈希缓存
执行命令重置整个哈希表:
hash -r
此操作会清除所有命令的缓存,Shell会重新遍历PATH查找命令。
方法3:重启Shell
执行命令重启当前Shell,哈希缓存会被重置:
exec bash
激活环境后执行该命令,后续python命令就会指向虚拟环境版本。
额外检查(可选)
如果上述方法无效,检查是否存在python别名:
alias python
若输出类似alias python='python3.10',说明别名覆盖了PATH,执行unalias python即可解除别名。
内容的提问来源于stack exchange,提问作者elaz
相关产品推荐
相关产品推荐

