深色模式
Python 环境与虚拟环境
概述
刚开始用 Python 时,最容易混的不是语法,而是环境。解释器装在哪,pip 装到哪,当前项目到底用了哪个版本,为什么昨天还能跑、今天就不行,这些问题通常都和环境有关。
把这件事说简单一点,至少要分清三层:Python 解释器是运行程序的,pip 是装包的,虚拟环境是给项目做隔离的。三者职责分开之后,很多问题会好排查很多。
先分清三个对象
Python 解释器
解释器负责执行 .py 代码,例如:
sh
python3 app.py系统里可以同时装多个 Python 版本,例如 3.11、3.12。项目到底用哪个版本,会直接影响依赖兼容性和运行结果。
pip
pip 是 Python 的包管理工具,用来安装第三方依赖,例如:
sh
python3 -m pip install requests这里推荐用 python3 -m pip,而不是直接敲 pip,因为它能更明确地告诉系统:用当前这个解释器对应的 pip 去装包。
虚拟环境
虚拟环境用于给项目隔离依赖。它的价值在于:
- 不同项目可以用不同依赖版本
- 不污染全局环境
- 更容易复现项目运行条件
如果没有虚拟环境,两个项目一旦依赖不同版本的同一个库,通常就会开始互相拆台。
为什么新项目都建议用虚拟环境
原因非常现实:
- 项目 A 需要
Django 4.x - 项目 B 还停在
Django 3.x - 全局环境只有一份安装位置
如果都往全局环境里装,迟早会出现版本冲突。虚拟环境就是给每个项目单独准备一套依赖目录,让它们互不打架。
用 venv 创建一个项目环境
假设已经装好 Python 3,可以在项目目录里执行:
sh
python3 -m venv .venv这会创建一个 .venv 目录,里面包含:
- 当前项目专用的解释器入口
- 专用的
pip - 专用的依赖安装位置
激活虚拟环境
在 macOS 或 Linux 下:
sh
source .venv/bin/activate激活后,终端里的 python 和 pip 会优先指向这个虚拟环境。
退出时执行:
sh
deactivate安装依赖和记录依赖
激活后再安装包:
sh
python -m pip install requests如果希望记录当前依赖版本,可以导出:
sh
python -m pip freeze > requirements.txt其他人拿到项目后,再按这个文件安装:
sh
python -m pip install -r requirements.txt一个最小可运行示例
python
def main() -> None:
print("hello, python")
if __name__ == "__main__":
main()这里的 if __name__ == "__main__": 表示:只有脚本被直接执行时才运行 main(),如果它被别的模块导入,就不自动执行。
Homebrew、系统 Python 和项目 Python
在 macOS 上,很多人会通过 Homebrew 安装 Python。这没有问题,但要记住一点:系统里的 Python、Homebrew 安装的 Python、虚拟环境里的 Python 可能不是同一个位置。
排查环境问题时,常用这几个命令:
sh
which python3
python3 --version
python3 -m pip --version看清它们指向哪里,比反复重装更有效。
常见问题
明明装了包,却 ModuleNotFoundError
通常是包装到了别的解释器环境里。也就是说,运行代码的 python 和安装包的 pip 不是同一套环境。
虚拟环境目录要不要提交到仓库
通常不要。项目里保留依赖清单即可,例如 requirements.txt。.venv 更适合本地生成。
全局安装是不是完全不能用
不是。命令行工具、个人常用脚本可以视情况全局安装。但项目依赖,尤其是团队协作项目,最好仍然放进虚拟环境。
