日常笔记-1005-1

问题:

为什么在创建虚拟环境之前,输出是这样的,必须要 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 就可能再次变成"找不到命令"。

相关推荐
yl45301 小时前
内蒙热门的废酸再生处理企业
大数据·python
nazisami1 小时前
程序地址空间
linux·虚拟地址
IT方大同1 小时前
java输入输出+方法
java·开发语言·python
kaixin_啊啊1 小时前
彩谱FS-13高光谱相机学习笔记
图像处理·笔记·学习·高光谱相机
不会就选b1 小时前
Linux之TCP<2>
linux·网络·tcp/ip
Java后端的Ai之路2 小时前
Python 进阶探索30 - Python中的装饰器
开发语言·人工智能·python·文件处理·装饰器模式
沫璃染墨2 小时前
《从零入门Linux系统篇(五十八):线程篇·十一——线程安全与死锁详解:从可重入到多锁管理》
linux·服务器·开发语言·c++·驱动开发·安全·架构
言乐62 小时前
Python基于关键词分拣快递(适用于电商与货运代理等)
开发语言·python·django·virtualenv·pygame