Python Web开发入门(一):虚拟环境与依赖管理,从零搭建纯净开发环境

作者:一个踩了9年坑的Python后端程序员

阅读提示:本文适合初中级开发者,预计阅读时间10分钟。建议边读边动手操作,效果翻倍!

一、开篇:为什么你的Python项目总是"跑不起来"?

"在我电脑上明明能运行,怎么到你这里就报错了?"

这句话是不是特别耳熟?作为一个有9年开发经验的老兵,我见过太多这样的场景:

  • 项目A需要Django 2.2,项目B需要Django 3.0,全局安装只能有一个版本
  • 同事更新了某个包,你的本地代码突然就崩了
  • 生产环境和开发环境依赖不一致,部署时各种幺蛾子
  • 新来的小伙伴花了一整天配环境,最后还得你亲自出马

根本原因:没有做好环境隔离!

Python的包管理有个"先天缺陷"------默认全局安装。不同项目共用同一套环境,迟早要出问题。

所以,我的第一条血泪教训:每个Python项目,必须有自己的"独立房间"------虚拟环境。

二、虚拟环境工具大乱斗:我该选哪个?

市面上的工具让人眼花缭乱,我帮你捋一捋:

工具 一句话评价 适用场景
venv(Python内置) "官方亲儿子,够用就行" 新手首选、简单项目、快速原型
virtualenv "venv的老大哥,兼容性更好" 旧版Python(2.7+)、需要更多配置选项
pipenv "曾经很火,现在有点凉" 中大型项目、依赖安全要求高(但注意社区活跃度下降)
poetry "现代项目管理全才" 正经Python项目、库开发、需要打包发布
conda "数据科学家的瑞士军刀" 机器学习、科学计算、需要管理非Python依赖
uv "速度狂魔的福音" 追求极致安装速度、现代项目
PDM "PEP标准的践行者" 遵循最新Python打包标准、希望不用虚拟环境

我的选择建议(基于9年实战):

  • 绝大多数Web项目venv + pip 就够用了(别让工具复杂性拖慢你)
  • 需要严格版本控制 :上 poetry(依赖解析优秀,打包发布一体)
  • 数据科学/ML :老老实实用 conda(CUDA、非Python依赖它最香)
  • 团队协作:统一工具,别混用!(这是血的教训)

今天我们就用Python自带的venv,因为:

  1. 零安装(Python 3.3+自带)
  2. 跨平台(Windows/Mac/Linux通吃)
  3. 足够Web开发需求
  4. 学会它,其他工具触类旁通

三、手把手教程:用venv搭建纯净环境

第1步:创建项目目录

复制代码
# 打开终端,创建一个新项目
mkdir my_web_project
cd my_web_project

第2步:创建虚拟环境

复制代码
# 核心命令(记住这一个就够了)
python -m venv venv

命令解释:

  • python -m venv:调用Python内置的venv模块
  • 最后一个venv:虚拟环境的目录名 (可以自定义,但建议就叫venv

成功标志: 项目目录下多了一个venv/文件夹。

第3步:激活虚拟环境(⚠️关键步骤!)

Windows系统:

复制代码
# 方法1(CMD命令提示符)
venv\Scripts\activate.bat

# 方法2(PowerShell,推荐)
.\venv\Scripts\Activate.ps1

Mac/Linux系统:

复制代码
source venv/bin/activate

激活成功的核心标志: 终端命令行最前面出现(venv)前缀!

如果没有看到(venv),说明没激活成功,后面所有操作都会装到全局环境!

第4步:验证激活状态

复制代码
# 查看当前Python解释器路径
which python  # Mac/Linux
where python # Windows

# 预期输出:路径应该指向你的项目目录下的venv文件夹
# 例如:/Users/你的用户名/my_web_project/venv/bin/python

第5步:安装项目依赖

复制代码
# 激活状态下,安装Flask(以Flask为例)
pip install flask==3.0.0

# 安装其他依赖
pip install pandas requests sqlalchemy

重要提示: 安装时尽量指定版本号!避免自动升级导致意外问题。

第6步:生成依赖清单(协作/部署必备)

复制代码
# 生成requirements.txt(只包含当前虚拟环境的包)
pip freeze > requirements.txt

打开生成的requirements.txt,你会看到类似内容:

复制代码
click==8.1.7
Flask==3.0.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.3
pandas==2.1.4
requests==2.31.0
SQLAlchemy==2.0.23
werkzeug==3.0.1

第7步:退出虚拟环境

复制代码
deactivate

看到(venv)前缀消失,说明已退出。

四、依赖管理进阶:告别"在我电脑能跑"

4.1 requirements.txt的最佳实践

烂代码示例(千万别学):

复制代码
requests
flask
pandas

(问题:不指定版本,每次安装可能都是不同版本)

合格写法:

复制代码
requests==2.31.0
flask==3.0.0
pandas==2.1.4

优秀写法(分层管理):

requirements.txt(生产依赖):

复制代码
# 核心依赖
requests==2.31.0
flask==3.0.0
sqlalchemy==2.0.23

# 数据库驱动(根据实际选一个)
psycopg2-binary==2.9.9  # PostgreSQL
mysql-connector-python==8.1.0  # MySQL

requirements-dev.txt(开发依赖):

复制代码
# 包含生产依赖
-r requirements.txt

# 开发专用工具
pytest==7.4.3
black==24.1.0
flake8==6.1.0
mypy==1.8.0
pre-commit==3.5.0

安装时:

复制代码
# 生产环境
pip install -r requirements.txt

# 开发环境
pip install -r requirements-dev.txt

4.2 版本锁定策略

问题: 直接pip freeze会把所有包(包括子依赖)都锁死,升级困难。

解决方案: 使用pip-tools实现智能版本控制。

复制代码
# 安装pip-tools
pip install pip-tools

# 1. 创建requirements.in(声明顶层依赖)
# 内容:
flask>=3.0.0
requests>=2.30.0
pandas>=2.1.0

# 2. 生成精确版本的requirements.txt
pip-compile requirements.in

# 3. 安装(带哈希校验,防篡改)
pip install --require-hashes -r requirements.txt

好处:

  • 升级单个包时,只改.in文件,重新compile
  • 自动解决依赖冲突
  • 支持平台条件依赖(如:uvloop; sys_platform != "win32"

五、9年踩坑实录:这些错误你别再犯

坑1:虚拟环境放错位置

错误做法:venv建在项目目录里,然后提交到Git。

后果:

  • Git仓库臃肿(一个venv可能几百MB)
  • 不同操作系统环境不兼容(Windows vs Linux)
  • 团队成员环境混乱

正确做法:

  1. venv加入.gitignore(必须!)
  2. 使用项目相对路径:python -m venv .venv(.venv是隐藏文件夹)
  3. 或者集中管理:python -m venv ~/virtualenvs/my_project

坑2:环境嵌套(Conda专属大坑)

症状: 激活虚拟环境后,python -c "import sys; print(sys.path)"显示的路径不对。

原因: 从base环境直接conda activate myenv,导致环境嵌套。

解决方案:

复制代码
# 先退出base环境
conda deactivate

# 再激活目标环境
conda activate myenv

检查: 运行conda info,看shell level是否为1(是1就对了)。

坑3:Windows权限问题

症状: venv\Scripts\activate.ps1无法执行。

原因: PowerShell执行策略限制。

解决方案(管理员运行PowerShell):

复制代码
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

坑4:IDE不识别虚拟环境

症状: PyCharm/VSCode找不到项目解释器。

解决步骤:

  1. PyCharm:File → Settings → Project → Python Interpreter → 添加
  2. VSCode:按Ctrl+Shift+P → Python: Select Interpreter → 选择venv/bin/python
  3. 确保在项目根目录打开IDE

坑5:依赖版本冲突

经典案例: 项目A需要numpy<1.20,项目B需要numpy>=1.21

我的解法:

  1. 每个项目独立虚拟环境(基础中的基础)
  2. 使用pipdeptree可视化依赖关系
  3. 对关键依赖(如TensorFlow、PyTorch)建立版本对照表

六、实战:从零创建Flask项目

6.1 环境搭建

复制代码
# 1. 创建项目
mkdir flask_demo
cd flask_demo

# 2. 创建虚拟环境
python -m venv venv

# 3. 激活
# Windows:
.\venv\Scripts\Activate.ps1
# Mac/Linux:
source venv/bin/activate

# 4. 安装Flask
pip install flask==3.0.0

6.2 项目结构

复制代码
flask_demo/
├── venv/                    # 虚拟环境(.gitignore忽略)
├── requirements.txt         # 依赖清单
├── app.py                   # 主程序
├── templates/               # 模板文件夹
│   └── index.html
└── static/                  # 静态文件
    └── style.css

6.3 核心代码

app.py

复制代码
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def hello():
    return render_template('index.html', name='开发者')

if __name__ == '__main__':
    app.run(debug=True)

templates/index.html:

复制代码
<!DOCTYPE html>
<html>
<head>
    <title>我的第一个Flask应用</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
    <h1>你好,{{ name }}!</h1>
    <p>恭喜你,虚拟环境配置成功!</p>
    <p>当前Python路径:{{ python_path }}</p>
</body>
</html>

requirements.txt:

复制代码
Flask==3.0.0

6.4 运行测试

复制代码
# 激活环境下
python app.py

访问 http://127.0.0.1:5000,看到欢迎页面即成功。

七、常备工具清单

  1. 依赖分析: pipdeptree(可视化依赖树)
  2. 环境检查: python -m site(查看当前环境路径)
  3. 包搜索: pip search(查找可用包)
  4. 缓存清理: pip cache purge(清理下载缓存)
  5. 环境复制: pip freeze > requirements.txt + pip install -r requirements.txt

八、互动时间

问题1: 你曾经在虚拟环境上踩过最大的坑是什么?

问题2: 对于团队项目,你推荐哪种依赖管理方案?为什么?

问题3: 如果你要教一个完全新手,会从哪个工具开始?

欢迎在评论区分享你的经验!

作者寄语: 虚拟环境是Python开发的"安全带",可能一辈子用不上,但用上一次就能救你的项目。花10分钟学会,受益10年。

原创声明: 本文为作者9年实战经验总结,转载请注明出处。

相关推荐
今天AI了吗39 分钟前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
风月说与山鬼1 小时前
三、大括号语法
前端·react.js
卷无止境1 小时前
Windows 上丝滑开发 Python,并稳定构建 Docker 镜像
后端·python·docker
kyriewen1 小时前
我把最常踩的8个CORS跨域报错整理了一遍——第8个去年还不存在
前端·javascript
TELL5211 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
fpcc1 小时前
工具使用—git diff命令分析说明
git·工具
Csvn2 小时前
🐍 Day 4: Python 控制流 — 条件、循环与推导式的艺术
后端·python
Csvn2 小时前
🕰️ 闭包 + setTimeout 的 5 个经典陷阱:为什么定时器看到的永远不是最新的值?
前端
动词ing2 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法