臭名昭著aTrust隔离计划1.臭名昭著aTrust隔离计划2.VPN原理与aTrust隔离网络实践3.docker-easyconnect到底做了什么4.TUN(tunnel-隧道-虚拟网卡)模式
个人项目
personal(个人展示)GitHub Actions 自动部署个人展示项目
基于Quartz搭建的个人博客1.Quartz个人博客使用教程2.使用 rsync 增量部署 Quartz 博客3.使用 GitHub Actions 自动部署 Quartz 博客5.域名绑定6.CDN加速7.Google 搜索收录排查:为什么关键词搜得到别人,却搜不到我的网站?Obsidian、双向链接与知识图谱
架构设计
分布式分布式事务RPC原理
旅行
行程攻略青岛三日游行程攻略
前端
NginxNginx配置与反向代理入门
Nodenpm与npx的区别
数据库
mysql01.MySQL基础语法与约束02.MySQL数据库类型03.MySQL多表查询04.MySQL 索引05.MySQL 事务06.MySQL 隔离级别07.MySQL MVCC08.MySQL 锁09.EXPLAIN10.慢查询与 SQL 优化
mysql面试题01.索引问题02.事务与隔离级别03.锁机制04.存储引擎与性能优化05.用户权限、字符集与备份恢复
mysql实战01.EXPLAIN实战02.测试环境菜单误删排查与恢复03.MySQL IN 详解
网络
网络安全1.无线监听网卡苹果M系列虚拟机安装Kali Linux教程3.kali怎么使用RTL8812AU4.kali基础命令
网络基础进程之间怎样通过网络传递数据
网址常用网址
中间键
esElasticsearch 入门
mq
RabbitMQRabbitMQ高级RabbitMQ基础
1. MQ 基础2. MQ 核心角色与代码对应3. MQ Consumer Group 与消费模式4. SOFAMQ 账户变更代码实践5. MQ 可靠性问题6. 消息幂等
redis缓存击穿、穿透与雪崩Redis 分布式锁Redis 缓存问题Redis 数据结构
AI
使用说明
第三方插件&技能简介Archify使用与安装指南geekgeekRun使用OfferFlow使用指南Ponytail使用指南Skills Manager使用指南
CodexCodex CLI与IDE区别及使用指南Codex Hook单独配置与提交通知Codex MCP安装与使用指南Codex第三方插件安装与使用指南
Agent开发0-学习路线1.LLM、Token、上下文窗口与模型参数2.大模型 API、请求参数与响应结构3.Spring AI ChatClient4.Prompt、System Prompt、Prompt 模板6.结构化输出、JSON Schema7.SSE 流式响应8.会话 ID、聊天记录、Redis9.超时、重试、限流、降级10.*完成可运行聊天接口11.Function Calling、Tool Calling 原理12.用 Java 方法定义 Tool13.工具参数设计和校验14.实现订单查询工具15.实现物流查询工具16.实现库存查询工具17.多个工具自动选择18.工具异常、超时、重试
diy主机
主机零件学习1.CPU2.主板3.内存4.显卡5.硬盘6.散热7.风扇8.机箱热门型号价格表
捡垃圾diy-13600kf+5060diy-14600kf+5070
English高频词汇英文基础语法简单句子音标
GitGit常用命令Sublime Merge 使用指南
Java
工具库Caffeine本地缓存Reactor教程
工作实践如何使用@Async线程池使用与排查线上服务 CPU 使用率过高排查压测下RPC接口大量失败排查记录
基础1.HashMap2.ConcurrentHashMap3.HashSet4.final5.static6.volatile7.AtomicInteger8.String动态代理反射锁与线程同步线程注解
面试题1.HashMap 存储在方法内是线程安全的吗2.ArrayList参数传递与引用重新赋值3.== 和 equals 的区别、hashcode4.重载和重写的区别5.String、StringBuffer、StringBuilder区别及使用场景6.接口和抽象类7.ArrayList 与 LinkedList 的区别和扩容机制8.HashMap 和 Hashtable 的区别及底层实现9.Object 和 Objects 的区别10.ThreadLocal的原理和使用场景11.字节码是什么及作用12.Java类加载器有哪些13.双亲委派模型14.Java异常体系15.GC是什么16.GC如何判断对象可以被回收
面试总结0.HR面试模板1.面试一2.面试二3.面试三笔试
网络与 IO(黑马程序员-纯理论)01-网络编程基础02-IO模型与零拷贝03-BIO04-NIO基础与缓冲区05-NIO通道与选择器06-AIO
juc00-目录01-进程与线程02-线程同步与通信03-并发设计模式04-Java内存模型05-CAS与原子类06-ThreadLocal07-阻塞队列08-线程池使用与原理09-任务调度10-ForkJoin与享元模式11-AQS12-ReentrantLock13-读写锁14-并发协作工具15-ConcurrentHashMap16-CopyOnWrite与同步容器17-SkipListMap18-非阻塞队列
juc(工作常见)Java并发编程三个重点拆解
jvm1. JVM运行时数据区
Spring1.Spring IoC、DI与构造方法注入CGLIB、Byte Buddy 与 Spring AOPSpring 常用注解详解Spring Bean 生命周期
Spring MVC异常处理机制
linux常用命令
mac快捷键终端常用操作
python
基础01.Python是什么,为什么要安装Python02.Python项目中.venv是什么03.Python基础语法
基础实战sql替换
HTTPXHRMS员工详情接口调用(Python HTTPX)
windowswindows激活

一、💡 一句话理解

核心结论

.venv 是当前 Python 项目专属的“依赖隔离区”。它让项目使用自己安装的库和 Python 命令,避免与电脑全局环境、其他项目的库版本互相影响。

在 PyCharm 的项目树里看到 .venv,通常说明这个项目已经创建了自己的虚拟环境。它不是业务代码目录,而是开发运行环境的一部分。

如果你还在熟悉变量、函数等语言写法,可以先阅读 03.Python基础语法;.venv 解决的是“代码要由哪套 Python 和依赖来运行”的问题。

二、🧭 理论:它是什么

2.1 .venv 与 venv

venv 是 Python 标准库中用于创建虚拟环境的模块;.venv 只是大家约定俗成的目录名。

例如,在项目根目录执行下面的命令,就会创建一个名为 .venv 的虚拟环境目录:

# 使用当前 python 创建项目专属的虚拟环境。
python -m venv .venv

点号 . 让它在大多数文件管理器中显示为隐藏目录。这样做只是为了不让项目根目录显得杂乱,不是特殊语法;把目录取名为 venv、.python-env 也能正常工作。

2.2 为什么需要它

不同项目常常需要同一个库的不同版本。例如:

项目所需依赖
A 项目requests==2.28
B 项目requests==2.32

如果两个项目都把依赖装到电脑的同一个全局 Python 中,后安装的版本可能覆盖先安装的版本,导致旧项目突然报错。

.venv 相当于给每个项目准备独立工具箱:项目 A、项目 B 和系统 Python 各自存放自己的依赖,互不干扰。

2.3 它不等于 Python 的完整副本

虚拟环境是基于某个已经安装好的 Python(称为基础 Python,base Python)创建的。

2.3.1 基础 Python 是什么

基础 Python 就是电脑上原本已经安装好的 Python。例如,在终端执行下面的命令:

# macOS / Linux 上常用的 Python 3 命令。
python3 --version

输出的版本,例如 Python 3.12.x,对应的就是可用于创建 .venv 的基础 Python。

创建虚拟环境时,关系可以理解为:

电脑已安装的 Python(基础 Python)
            ↓ 使用 python3 -m venv .venv 创建
项目专用的 .venv
            ↓
项目专用的 Python、pip 和第三方库

.venv 会使用该基础 Python 的版本和运行能力,但会保存当前项目自己的依赖。例如,基础 Python 是 3.12,执行 python3 -m venv .venv 创建的环境也会基于 Python 3.12 工作。

Python 官方文档说明:默认情况下,虚拟环境不会直接使用基础 Python 已安装的第三方包;只有明确装进 .venv 的包才会被使用。换句话说,基础 Python 是“母体”,.venv 是从它创建出来、供当前项目独立使用的小环境。

所以,.venv 重点保存的是:

  • 项目使用的 Python 入口或链接;
  • 当前项目的 pip;
  • 当前项目安装的第三方包;
  • 环境配置文件。

你的 day1、day2、ai 等源码目录不应放进 .venv。

三、⚙️ 理论:它是怎么工作的

3.1 目录里通常有什么

在 macOS 和 Linux 中,常见结构如下:

pythonDemo/
├── .venv/
│   ├── bin/                 # 此环境的 python、pip、activate 等命令
│   ├── lib/python3.x/
│   │   └── site-packages/   # 此项目安装的第三方库
│   └── pyvenv.cfg           # 环境与基础 Python 的关联配置
├── day1/                    # 你的学习代码
└── ...

Windows 中对应的命令目录叫 Scripts/,库目录通常叫 Lib/site-packages/。

3.2 激活到底做了什么

激活(activate)不是启动一个新 Python,也不是必须步骤。它主要把 .venv/bin 临时放到终端命令搜索路径 PATH 的最前面。

激活前:python  ──> 系统或其他环境的 Python
激活后:python  ──> .venv/bin/python

因此,激活后执行 python 和 pip,会自动使用 .venv 里的版本。Python 官方也说明:即使不激活,直接使用 .venv/bin/python 也可以运行该环境;激活只是更方便。

3.3 为什么不能随意复制或移动 .venv

环境内安装的命令通常会记录 .venv 中 Python 的绝对路径。把项目或 .venv 移到另一处后,这些路径可能失效。

移动项目后的处理方式

不要复制旧 .venv。删除旧环境,再在新位置创建一个,并根据依赖清单重新安装库,通常更可靠。

四、🚀 实践:从准备到验证

4.1 前置准备

先在终端确认 Python 可用:

# macOS 上常用 python3;若 python 已指向 Python 3,也可以使用 python。
python3 --version

建议每个项目根目录只保留一个 .venv。PyCharm 创建项目时如果选择了 Project venv,通常会自动创建并选中它;无需再用命令行重复创建。

4.2 在 PyCharm 新建项目时创建 .venv

你截图中的配置已经基本正确,可以按下面的顺序操作:

  1. 在 Location 中填写项目目录,例如 /Volumes/data/pycharmProject/zhScripts。

  2. Create Git repository 表示同时初始化 Git 仓库,按需勾选;它与创建 .venv 没有直接关系。

  3. Create a welcome script 表示生成一个示例 Python 文件,也是可选项。

  4. Interpreter type 保持默认的 Project venv。

    Interpreter type 表示“PyCharm 要用哪种方式为项目准备 Python 解释器”。选择 Project venv,就是让 PyCharm 为当前项目自动创建一套独立的 Python 虚拟环境,并用它运行项目代码。

    • Interpreter:Python 解释器,也就是实际执行 .py 代码的程序;
    • Project:这套环境只供当前项目使用;
    • venv:Python 虚拟环境,用来隔离不同项目安装的第三方库。

    结合截图中的配置,创建关系如下:

    系统中已经安装的 Python 3.13
                  ↓ 作为基础 Python
    PyCharm 创建 zhScripts/.venv
                  ↓ 设为项目解释器
    运行 zhScripts 项目中的 Python 代码

    点击 CREATE 后,PyCharm 会在项目根目录创建 .venv,使用所选的 Python 版本生成环境,并将 .venv 中的 Python 设置为当前项目的解释器。它相当于替你执行下面的命令,并继续完成解释器配置:

    python3 -m venv .venv

    应该怎么选

    对于普通 Python 项目,保持默认的 Project venv 即可。只有打算使用已经存在的虚拟环境、Conda 或其他特殊环境时,才需要选择其他类型。

  5. 在 Python version 中选择电脑上已经安装的基础 Python。截图中的 Python 3.13 可以直接使用。

  6. 确认界面提示的虚拟环境位置为项目根目录下的 .venv,例如:

    /Volumes/data/pycharmProject/zhScripts/.venv
  7. 点击右下角 CREATE。

创建完成后,PyCharm 会自动完成两件事:

  • 在项目根目录生成 .venv;
  • 把 .venv 中的 Python 设置为当前项目的解释器。

也就是说,不用提前手动创建 .venv。你只需保持截图中的 Project venv 选项并点击 CREATE。

可以在 PyCharm 的终端中验证:

# 显示当前终端使用的 Python 路径。
which python
 
# 显示 Python 解释器的完整路径。
python -c "import sys; print(sys.executable)"

如果输出路径包含 /zhScripts/.venv/bin/python,就说明创建并配置成功。若终端没有自动使用它,可先执行:

source .venv/bin/activate

已经创建了项目怎么办

不需要重新建立项目。打开 PyCharm 的 Python Interpreter 设置,选择添加本地解释器并新建 Virtualenv,将环境位置设为当前项目下的 .venv,再选择基础 Python 即可。

4.3 可以拿来干什么

4.3.1 为项目单独安装依赖

例如,当前项目需要发送 HTTP 请求时,先进入项目根目录并激活环境:

# macOS / Linux:激活名为 .venv 的虚拟环境。
source .venv/bin/activate
 
# 此时安装的 requests 只属于当前项目。
python -m pip install requests

输入是安装命令;pip 会把 requests 放到 .venv 的 site-packages 中。其他项目不会自动获得这个库。

4.3.2 确认当前使用的是不是 .venv

# macOS / Linux:应显示项目中的 .venv/bin/python。
which python
 
# 查看当前环境已安装的包。
python -m pip list

如果第一条命令的输出包含项目路径中的 .venv/bin/python,说明终端正在使用该项目的虚拟环境。

4.3.3 固化依赖,方便重建环境

# 在已激活的环境中,把当前安装的依赖及版本写入清单。
python -m pip freeze > requirements.txt

requirements.txt 是可以提交到 Git 的文本清单;.venv 本身通常不提交。以后重建环境后,可按清单恢复。

4.4 完整实践:代码、启动和验证

下面以 macOS 上的 pythonDemo 为例,演示从创建到验证的完整流程。请在项目根目录执行。

# 1. 创建 .venv;若你已通过 PyCharm 创建过,可跳过本步。
python3 -m venv .venv
 
# 2. 让当前终端优先使用 .venv 中的 python 和 pip。
source .venv/bin/activate
 
# 3. 升级当前环境的 pip,再安装示例依赖。
python -m pip install --upgrade pip
python -m pip install requests
 
# 4. 记录依赖,供其他电脑或未来重新创建环境时使用。
python -m pip freeze > requirements.txt

接着在项目根目录新建 check_venv.py:

"""检查当前程序是否由虚拟环境中的 Python 运行。"""
 
import sys
 
# sys.prefix 是当前解释器的环境目录;
# sys.base_prefix 是创建该环境所依赖的基础 Python 目录。
is_venv = sys.prefix != sys.base_prefix
 
print(f"当前 Python:{sys.executable}")
print(f"当前是否在虚拟环境中:{is_venv}")

运行并验证:

# 使用已激活环境中的 Python 运行检查脚本。
python check_venv.py

预期结果类似:

当前 Python:/你的项目路径/pythonDemo/.venv/bin/python
当前是否在虚拟环境中:True

完成后可执行下面的命令退出环境:

# 只影响当前终端窗口,不会删除 .venv。
deactivate

4.5 常见问题排查

现象常见原因处理方法
ModuleNotFoundError包装到了全局 Python,当前 .venv 没有该包激活 .venv 后执行 python -m pip install 包名
which python 没有 .venv未激活环境,或 IDE 解释器未选对终端执行 source .venv/bin/activate;PyCharm 中选择项目的 .venv 解释器
项目移动后命令报错.venv 内保存的旧路径失效删除 .venv,执行 python3 -m venv .venv,再执行 python -m pip install -r requirements.txt
Git 出现大量 .venv 文件没有忽略虚拟环境在 .gitignore 中加入 .venv/

.gitignore 的最小配置:

# 虚拟环境可由 requirements.txt 重建,不提交到 Git。
.venv/

五、📌 总结

  • .venv 是项目专属的 Python 虚拟环境目录,不是业务源码。
  • 它解决的是“不同项目依赖版本互相冲突”的问题。
  • 激活后,python 和 pip 会优先使用 .venv 中的版本;不激活也可直接指定 .venv/bin/python。
  • .venv 应加入 .gitignore,不要提交、复制或搬运;用 requirements.txt 记录并重建依赖。
  • 在 PyCharm 中,确认项目解释器指向当前项目的 .venv,就能正常使用其中安装的库。

六、📚 官方资料