问题:
为什么在创建虚拟环境之前,输出是这样的,必须要 python3.12 --version 才行
xuxiaorui@U-C47PDXMX-0020 purchase-lab % python --version
zsh: command not found: python
但是 创建虚拟环境并启动后 ,
((myEnv3.12) ) xuxiaorui@U-C47PDXMX-0020 purchase-lab % python --version
Python 3.12.13
就可以直接 python --version 了?
解答:
因为激活虚拟环境后,终端查找命令的位置变了。 虚拟环境中有一个叫 python 的可执行入口,激活后终端优先找到它。
可以分三步理解。
1. python 和 python3.12 是两个不同的命令名。
你输入:
bash
python --version
zsh 会寻找一个名字叫 python 的程序。它不会自动推断:
"找不到 python,那我帮你改用 python3.12。"
激活前,你的终端能找到 python3.12,却找不到 python,所以前者可以执行,后者报 command not found。
2. 创建虚拟环境时,会生成自己的 Python 入口。
假设环境目录叫 myEnv3.12,内部通常包含:
text
myEnv3.12/
├── bin/
│ ├── python
│ ├── python3
│ ├── python3.12
│ ├── pip
│ └── activate
├── lib/
└── pyvenv.cfg
其中,bin/python 通常通过符号链接等方式关联到创建这个环境所用的 Python 3.12。
因此,这个环境里已经有一个名字叫 python 的入口。
3. 激活脚本把这个 bin 目录放到 PATH 最前面。
PATH 是终端查找可执行程序的目录列表,从前往后找,优先使用先找到的程序。
激活前,可以简化理解为:
text
PATH:
/opt/homebrew/bin → /usr/bin → /bin
执行:
bash
source myEnv3.12/bin/activate
之后变成:
text
PATH:
你的项目/myEnv3.12/bin → /opt/homebrew/bin → /usr/bin → /bin
于是,再输入:
bash
python --version
查找过程就是:
text
寻找名为 python 的程序
↓
先进入 myEnv3.12/bin
↓
找到 myEnv3.12/bin/python
↓
执行它,输出 Python 3.12.13
所以,这里的"激活"主要是在修改当前终端的环境变量,并没有启动一个一直运行的 Python 进程。
你可以在当前已激活的终端验证:
查看实际找到的 Python:
bash
command -v python
查看当前虚拟环境的目录:
bash
echo "$VIRTUAL_ENV"
查看命令查找路径:
bash
echo "$PATH"
你应该发现:
python指向虚拟环境里的bin/python。VIRTUAL_ENV指向虚拟环境目录。PATH最前面是这个环境的bin目录。
还有一个有助于理解的事实:不激活,也可以通过完整路径使用虚拟环境。 假设环境目录确实叫 myEnv3.12,在项目目录执行:
bash
./myEnv3.12/bin/python --version
同样可以使用它。激活只是让你不用每次都写这段路径。
退出环境时执行 deactivate,原来的 PATH 会恢复,python 就可能再次变成"找不到命令"。