3. 环境搭建:Python版本选择、虚拟环境、依赖管理

做数据访问审计SDK开发,第一件事不是写代码。

先把环境搭好。我见过不少新手,上来就pip install一把梭,结果项目做到一半发现依赖冲突、版本不对、跑都跑不起来。嗯,这种坑我自己也踩过好几次。今天就把我这些年积累的环境搭建经验说清楚。

3.1 Python版本怎么选?

先说结论:推荐Python 3.9或3.10。为什么不是最新的3.12?不是越新越好,看生态兼容性。

  • Python 3.8:还在维护,但已接近EOL。如果你的生产环境只能用3.8,那也行。但新项目不建议了。
  • Python 3.9:我个人最常用。审计SDK依赖的库(比如sqlparse, cryptography)在3.9上测试最充分。
  • Python 3.10:支持match语句,写审计规则时很爽。大部分库已兼容。
  • Python 3.11/3.12:性能有提升,但某些审计专用的ORM库可能还没适配。你想想,项目写到一半发现某个库不支持,多郁闷。

避坑指南:我曾经接手过一个项目,用了Python 3.12的f-string调试特性,结果CI环境里的3.11直接炸了。所以,稳一点,选3.9或3.10。

小提示:如果公司有统一的镜像或pyenv,尽量保持一致。用pyenv管理多个Python版本,切换起来非常方便。

3.2 虚拟环境选哪个?

说白了,虚拟环境就是把项目的依赖隔离起来,防止“A项目需要Django 3.2,B项目需要Django 4.2”这种冲突。

Python自带的venv够用,但缺点是没有依赖锁定和完全的环境复现能力。我一般把虚拟环境分为两派:

  • 轻量派:直接python -m venv .venv + pip freeze > requirements.txt。适合小型脚本。
  • 工程派:用pipenv或poetry,自带依赖解析和锁定,还能分离开发/生产依赖。

我个人更推荐工程派。尤其是像审计SDK这种要对接多种数据库、多种Python版本的项目,依赖管理稍有不慎就出问题。我遇到过几次“我机器能跑,你机器跑不了”的尴尬,都是因为没用锁定文件。

3.3 依赖管理:pipenv vs poetry

这两个是当前最主流的工具。我列个表对比,你一看就明白。

特性 pipenv poetry
锁定文件 Pipfile.lock poetry.lock
依赖解析速度 较慢,尤其依赖多的时候 快,用了更先进的解析器
虚拟环境管理 自动创建和管理 自动创建和管理,且支持跨项目
发布到PyPI 需要额外工具(twine) 内置poetry build和发布功能
配置文件格式 Toml(Pipfile) Toml(pyproject.toml)——更标准
社区趋势 维护中,但活跃度下降 非常活跃,已成为主流

我个人的建议:新项目直接用poetry。理由很简单——它更贴近Python官方推荐的pyproject.toml规范,而且速度真的快。之前我把一个老项目从pipenv迁移到poetry,依赖解析时间从2分钟降到了20秒。

当然,如果你所在团队已经统一用pipenv,也不必强行换。工具只是工具,关键是锁定文件必须进版本控制。

3.3.1 快速上手poetry

# 安装poetry(推荐使用官方安装器)
curl -sSL https://install.python-poetry.org | python3 -

# 创建新项目
poetry new audit-sdk

# 进入项目目录
cd audit-sdk

# 添加依赖(生产)
poetry add sqlparse cryptography

# 添加依赖(开发)
poetry add --dev pytest black

# 安装所有依赖(包括lock中的)
poetry install

# 激活虚拟环境
poetry shell

# 锁定依赖(install时自动生成或更新poetry.lock)
注意:poetry默认会把虚拟环境创建在项目目录之外的缓存里。如果你想让虚拟环境就在项目根目录(方便IDE识别),执行 poetry config virtualenvs.in-project true。

3.4 环境搭建完整流程(SVG图)

下面这张图是我整理的完整环境搭建流程。跟着走,不会乱。

环境搭建流程 选择Python版本 安装poetry poetry new 项目 添加依赖 锁定 & 提交lock poetry shell 开发 提示:每次添加/更新依赖后,务必查看poetry.lock是否已更新,并一起提交。

3.5 实战中的一些坑

讲几个我踩过的坑,你以后可能也会遇到。

  • Python版本混用:同一个项目,有人用3.8,有人用3.11。结果3.8上依赖解析出失败。解决办法:在项目根目录放一个.python-version文件(pyenv读取的),或者直接在pyproject.toml里指定[tool.poetry.dependencies] python = "^3.9"。
  • 忘记激活虚拟环境:直接pip install把依赖装到了系统Python里,然后poetry install报错。我遇到过同事把pandas装到系统环境,项目里还用poetry,最后跑测试时发现两个版本冲突。
  • lock文件没进版本控制:这是最致命的。没有poetry.lock,你的依赖版本就是浮动的。昨天能跑,今天可能就不能跑了。我曾经因为这个问题在产品环境上排查了一整天,最后发现是一个依赖的小版本升级引入了bug。
核心记住一句话:虚拟环境隔离 + 锁定文件版本控制 = 可复现的环境。这是专业开发和临时脚本的分水岭。

3.6 用IDE辅助环境管理

说实话,命令行再熟练也不如IDE帮你自动识别环境来得省心。我用PyCharm和VS Code都很多,简单说下配置:

  • PyCharm:打开项目,点击右下角Python Interpreter,选择“Add Interpreter” -> “Poetry Environment”,它会自动找到项目的poetry虚拟环境。
  • VS Code:按Ctrl + Shift + P,输入“Python: Select Interpreter”,选择“Enter interpreter path” -> 输入~/.cache/pypoetry/virtualenvs/你的项目名*/bin/python。或者装Poetry插件,直接识别。

我个人的习惯:先用poetry把环境建好,然后用IDE打开项目时直接选那个虚拟环境。一旦选好,终端、调试器、代码补全都用同一个环境,再也不会出现“终端能跑,IDE里却报模块找不到”的问题。

好,环境搭好了。接下来就可以开始写真正的审计SDK代码了。