日常笔记-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 就可能再次变成"找不到命令"。

相关推荐
BK贝壳3 小时前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
2601_966949654 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
readhere8 小时前
从ZYNQ7000开发板,学会启动嵌入式Linux系统——入门学习:EBAZ4205篇目录
linux·启动·嵌入式linux·zynq7000·ebaz4205
在世修行9 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_962885729 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI9 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
‎ദ്ദിᵔ.˛.ᵔ₎9 小时前
关于Linux 线程局部存储的认识
linux·运维
信誓旦旦的程序猿10 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫10 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
小小de风呀11 小时前
de风——【从零开始学习Linux】(九):进程基础 —— 从冯诺依曼体系到 fork 创建进程
linux·学习