Python 虚拟环境
1. 什么是 Python 虚拟环境
Python 虚拟环境可以理解为:
text
给每个 Python 项目准备一套独立的运行环境它可以让不同项目拥有各自独立的:
text
Python 版本
第三方库
依赖版本例如:
text
project-a
└── requests 2.x
project-b
└── requests 3.x两个项目之间互不影响。
2. 为什么需要虚拟环境
假设电脑上只有一个全局 Python 环境。
项目 A 需要:
text
Django 4项目 B 需要:
text
Django 5如果都安装到全局 Python:
bash
pip install django就很容易出现版本冲突。
使用虚拟环境后:
text
project-a
└── .venv
└── Django 4
project-b
└── .venv
└── Django 5每个项目维护自己的依赖。
这也是现在 Python 项目开发中非常常见的做法。
3. 不推荐把所有库装到全局环境
例如:
bash
pip install requests
pip install numpy
pip install django
pip install flask如果这些包全部安装到系统 Python 中,时间久了容易出现:
text
依赖混乱
版本冲突
不知道某个包属于哪个项目
环境难以复现更推荐:
text
一个项目
一个虚拟环境4. Python 自带的 venv
Python 自带:
text
venv模块,可以创建虚拟环境。
首先查看 Python:
bash
python --version或者:
bash
python3 --version例如:
text
Python 3.13.55. 创建虚拟环境
进入项目目录:
bash
cd project创建虚拟环境:
bash
python -m venv .venv如果系统使用:
bash
python3则:
bash
python3 -m venv .venv这里:
text
.venv是虚拟环境目录名称。
一般推荐使用:
text
.venv6. 创建后的目录
例如项目:
text
project/执行:
bash
python -m venv .venv之后:
text
project/
├── .venv/
└── main.py虚拟环境中的 Python、pip 和安装的第三方库都会放在:
text
.venv里面。
7. 为什么叫 .venv
名字不是固定的。
下面这些都可以:
bash
python -m venv venv
python -m venv env
python -m venv .venv但是现代 Python 项目里非常常见:
text
.venv优点是:
text
名称统一
以 . 开头,不容易干扰项目目录
编辑器容易自动识别8. 激活虚拟环境
创建虚拟环境后,一般需要激活。
Linux / macOS
bash
source .venv/bin/activate激活之后,终端前面通常会出现:
text
(.venv)例如:
text
(.venv) moonlit@linux project $表示当前正在使用:
text
.venv虚拟环境。
9. Windows 激活
如果使用 Windows CMD:
cmd
.venv\Scripts\activatePowerShell:
powershell
.venv\Scripts\Activate.ps1Linux 和 macOS 通常使用:
bash
source .venv/bin/activate10. 激活后发生了什么
激活虚拟环境后执行:
bash
which python可能输出:
text
/home/moonlit/project/.venv/bin/python说明现在执行:
bash
python实际使用的是:
text
项目里的 Python而不是系统 Python。
11. 查看 Python 位置
Linux/macOS:
bash
which python例如虚拟环境没有激活时:
text
/usr/bin/python或者:
text
/opt/homebrew/bin/python3激活后:
text
/home/moonlit/project/.venv/bin/python这样就可以确认当前到底使用的是哪一个 Python。
12. 查看 pip 位置
同样可以:
bash
which pip激活虚拟环境之后可能得到:
text
/home/moonlit/project/.venv/bin/pip也就是说:
bash
pip install requests会把:
text
requests安装到当前虚拟环境中。
13. 安装第三方包
虚拟环境激活之后:
bash
pip install requests这个包会安装到:
text
.venv而不是全局环境。
查看:
bash
pip list例如:
text
Package Version
---------- -------
pip 25.2
requests 2.32.514. 推荐使用 python -m pip
除了:
bash
pip install requests还可以:
bash
python -m pip install requests这种写法的好处是可以明确:
text
使用当前这个 Python 对应的 pip例如:
bash
python -m pip install requests通常比单独写:
bash
pip install requests更不容易出现 Python 和 pip 对不上的问题。
15. 退出虚拟环境
退出虚拟环境:
bash
deactivate终端前面的:
text
(.venv)就会消失。
例如:
text
(.venv) project $执行:
bash
deactivate恢复:
text
project $16. 虚拟环境不是每次都要重新创建
第一次创建:
bash
python -m venv .venv以后重新打开终端时,不需要再次:
bash
python -m venv .venv只需要重新激活:
bash
source .venv/bin/activate也就是:
text
创建:通常只需要一次
激活:每次新开终端通常需要重新执行17. 删除虚拟环境
虚拟环境本质上就是一个目录。
如果不需要:
bash
rm -rf .venv即可删除。
以后需要时重新:
bash
python -m venv .venv然后重新安装依赖即可。
因此:
text
.venv通常不属于需要永久保存的重要项目文件。
18. .venv 不应该提交到 Git
Python 虚拟环境可能非常大,而且里面有很多:
text
可执行文件
第三方包
缓存
平台相关文件因此通常不会提交到 Git。
在:
text
.gitignore中加入:
gitignore
.venv/例如:
text
project/
├── .gitignore
├── .venv/
├── main.py
└── requirements.txt.gitignore:
gitignore
.venv/19. 那项目依赖怎么保存
虽然:
text
.venv不提交 Git,
但是项目需要记录:
text
安装了哪些第三方库传统方式通常使用:
text
requirements.txt20. requirements.txt
查看当前环境中的包:
bash
pip freeze例如:
text
requests==2.32.5
urllib3==2.5.0保存到文件:
bash
pip freeze > requirements.txt于是项目:
text
project/
├── .venv/
├── main.py
└── requirements.txt21. 根据依赖文件恢复环境
别人拿到项目后,可以创建新的虚拟环境:
bash
python -m venv .venv激活:
bash
source .venv/bin/activate然后:
bash
pip install -r requirements.txt即可安装项目依赖。
所以一般:
text
.venv 不提交
requirements.txt 提交22. 一个完整的 venv 工作流程
创建项目:
bash
mkdir python-demo
cd python-demo创建虚拟环境:
bash
python -m venv .venv激活:
bash
source .venv/bin/activate安装依赖:
bash
python -m pip install requests查看:
bash
pip list创建:
text
main.py写入:
python
import requests
print(requests.__version__)运行:
bash
python main.py保存依赖:
bash
pip freeze > requirements.txt退出:
bash
deactivate这就是最基础的 Python 虚拟环境流程。
uv 虚拟环境
23. 什么是 uv
除了 Python 自带的:
text
venv + pip现在也可以使用:
text
uv管理 Python 项目。
uv 可以处理:
text
Python 版本
虚拟环境
依赖安装
项目依赖
命令运行对于新项目来说非常方便。
24. 安装 uv
如果在 macOS 使用 Homebrew:
bash
brew install uv查看版本:
bash
uv --version25. 使用 uv 初始化项目
创建目录:
bash
mkdir python-demo
cd python-demo初始化:
bash
uv init通常会生成类似:
text
python-demo/
├── .gitignore
├── .python-version
├── README.md
├── main.py
└── pyproject.toml其中:
text
pyproject.toml用于保存项目配置和依赖信息。
26. 使用 uv 创建虚拟环境
可以直接:
bash
uv venv默认通常会创建:
text
.venv目录。
例如:
text
project/
├── .venv/
├── main.py
└── pyproject.toml27. 指定 Python 版本
例如:
bash
uv venv --python 3.13表示使用:
text
Python 3.13创建虚拟环境。
也可以使用 uv 管理 Python:
bash
uv python install 3.13然后:
bash
uv venv --python 3.1328. 激活 uv 创建的环境
uv 创建出来的:
text
.venv本质上仍然是标准 Python 虚拟环境。
因此 Linux/macOS 一样可以:
bash
source .venv/bin/activate然后:
bash
python --version查看当前 Python。
29. uv add
如果是一个 uv 项目,推荐使用:
bash
uv add requests而不是:
bash
pip install requestsuv add 不只是安装依赖,还会把依赖记录到:
text
pyproject.toml中。
例如:
bash
uv add requests之后可能看到:
toml
[project]
dependencies = [
"requests>=2.32.5",
]30. uv add 和 pip install
两者虽然都可以安装包,但作用不完全一样。
pip install
bash
pip install requests主要作用:
text
把 requests 安装到当前 Python 环境uv add
bash
uv add requests主要作用:
text
安装 requests
+
把 requests 记录为项目依赖
+
更新锁文件因此使用 uv 管理项目时,更推荐:
bash
uv add31. pyproject.toml
现代 Python 项目经常使用:
text
pyproject.toml记录项目配置。
例如:
toml
[project]
name = "python-demo"
version = "0.1.0"
requires-python = ">=3.13"
dependencies = [
"requests>=2.32.5",
]这里可以看到:
text
项目名称
版本
Python 版本要求
项目依赖32. uv.lock
使用 uv 添加依赖后,通常还会生成:
text
uv.lock例如:
text
project/
├── .venv/
├── main.py
├── pyproject.toml
└── uv.lock它用于锁定项目实际使用的依赖版本。
通常:
text
pyproject.toml
uv.lock都应该提交到 Git。
而:
text
.venv不提交。
33. uv run
uv 可以直接使用:
bash
uv run python main.py运行程序。
例如:
python
import requests
print(requests.__version__)运行:
bash
uv run python main.pyuv 会自动使用当前项目环境。
因此很多时候甚至不需要手动:
bash
source .venv/bin/activate34. 激活和 uv run 的区别
传统方式:
bash
source .venv/bin/activate
python main.pyuv 方式:
bash
uv run python main.py两种方式都可以。
简单理解:
text
activate
让当前整个终端进入虚拟环境而:
text
uv run
只让这一条命令在项目环境中运行35. 使用 uv 安装开发工具
例如安装:
text
black作为开发依赖:
bash
uv add --dev black然后运行:
bash
uv run black .这种方式可以确保项目使用固定版本的:
text
black而不需要全局安装。
36. 同步项目环境
如果:
text
pyproject.toml
uv.lock已经存在,
可以执行:
bash
uv syncuv 会根据项目依赖创建或更新:
text
.venv这在:
text
git clone一个项目之后非常常用。
37. uv 项目的常见流程
初始化:
bash
uv init添加依赖:
bash
uv add requests添加开发依赖:
bash
uv add --dev black运行:
bash
uv run python main.py格式化:
bash
uv run black .同步环境:
bash
uv sync这几个命令已经能够覆盖很多日常需求。
38. 克隆一个 uv 项目之后
假设:
bash
git clone https://example.com/project.git
cd project项目里有:
text
pyproject.toml
uv.lock通常只需要:
bash
uv sync然后:
bash
uv run python main.py即可运行。
不需要把原作者的:
text
.venv复制过来。
39. VS Code 与虚拟环境
在 VS Code 中,通常需要选择正确的 Python 解释器。
打开命令面板:
text
Command Palette搜索:
text
Python: Select Interpreter选择项目中的:
text
.venv/bin/python这样:
text
运行
补全
类型检查
第三方库识别都会使用当前项目环境。
40. Neovim 与虚拟环境
如果在终端中:
bash
source .venv/bin/activate然后启动:
bash
nvim很多 Python 工具会自动继承当前 Shell 环境。
也可以直接:
bash
uv run python main.py运行程序。
虚拟环境和编辑器是两个概念:
text
虚拟环境
负责 Python 和项目依赖
Neovim / VS Code
负责编辑代码41. 常见问题:为什么 import 报错
例如:
python
import requests编辑器提示:
text
Import "requests" could not be resolved但明明执行过:
bash
pip install requests很可能是:
text
安装 requests 的 Python和:
text
编辑器当前使用的 Python不是同一个。
可以检查:
bash
which python以及:
bash
python -m pip show requests确认是否安装到了当前环境。
42. python、python3 和 .venv/bin/python
Linux/macOS 上可能同时存在:
text
python
python3而虚拟环境中又有:
text
.venv/bin/python
.venv/bin/python3激活虚拟环境之后:
bash
which python如果得到:
text
项目/.venv/bin/python就说明当前:
bash
python已经指向虚拟环境。
因此激活后通常直接:
bash
python main.py即可。
43. 不要修改 .venv 里的文件
一般不要手动编辑:
text
.venv/里面的内容。
例如:
text
.venv/bin
.venv/lib这些应该由:
text
Python
pip
uv自动管理。
如果虚拟环境出现严重问题,通常最简单的方式是:
bash
rm -rf .venv然后重新创建。
44. 每个项目一个 .venv
推荐:
text
projects/
├── web-project/
│ ├── .venv/
│ └── ...
│
├── data-project/
│ ├── .venv/
│ └── ...
│
└── python-demo/
├── .venv/
└── ...而不是所有项目共同使用:
text
一个巨大的全局 Python 环境这样管理起来更加清晰。
45. venv 和 uv 怎么选
如果只是学习虚拟环境原理:
text
venv + pip非常值得掌握,因为它属于 Python 的基础能力。
基本命令:
bash
python -m venv .venv
source .venv/bin/activate
python -m pip install requests
deactivate如果日常自己创建现代 Python 项目:
text
uv会更加方便。
常见流程:
bash
uv init
uv add requests
uv run python main.py两者并不冲突。
理解:
text
venv之后再使用:
text
uv会更容易理解 uv 到底帮你做了什么。
46. venv 工作流速查
创建
bash
python -m venv .venv激活
bash
source .venv/bin/activate安装依赖
bash
python -m pip install requests查看依赖
bash
pip list导出依赖
bash
pip freeze > requirements.txt安装依赖
bash
pip install -r requirements.txt退出
bash
deactivate47. uv 工作流速查
初始化项目
bash
uv init创建虚拟环境
bash
uv venv添加依赖
bash
uv add requests添加开发依赖
bash
uv add --dev black运行程序
bash
uv run python main.py同步环境
bash
uv sync指定 Python
bash
uv venv --python 3.1348. 项目目录示例
使用 uv 的 Python 项目通常可以类似:
text
python-demo/
├── .venv/
├── .gitignore
├── .python-version
├── README.md
├── main.py
├── pyproject.toml
└── uv.lock其中:
text
.venv/本地虚拟环境,不提交 Git。
text
pyproject.toml项目配置和依赖声明。
text
uv.lock锁定依赖版本。
text
.python-version记录项目使用的 Python 版本。
小结
Python 虚拟环境最核心的目的就是:
text
隔离不同项目的 Python 和第三方依赖传统方式:
bash
python -m venv .venv
source .venv/bin/activate
python -m pip install requests
python main.py
deactivate使用 uv:
bash
uv init
uv add requests
uv run python main.py最重要的几个概念:
text
.venv
项目的虚拟环境
pip
安装 Python 包
requirements.txt
传统依赖记录方式
pyproject.toml
现代 Python 项目配置
uv.lock
锁定具体依赖版本
uv add
添加项目依赖
uv run
在项目环境中运行命令日常开发推荐养成:
text
一个项目一个虚拟环境并且不要把:
text
.venv提交到 Git。