2、开发环境搭建:Python虚拟环境、Docker容器化、依赖管理工具Poetry
说实话,Pipeline组件开发的第一步,往往不是写代码,而是把环境搭好。我见过太多新手一上来就pip install,结果项目还没跑起来,依赖就打架了。嗯,今天我们就来聊聊怎么把开发环境收拾得干干净净。
2.1 为什么需要虚拟环境?
你想想看,一个项目用Django 3.2,另一个用Django 4.0。如果都装到系统Python里,那不乱套了?虚拟环境就是干这个的——每个项目有自己的小天地,互不干扰。
我个人习惯用venv,Python 3.3+自带,不用额外装。创建方式很简单:
python -m venv pipeline_env
source pipeline_env/bin/activate # Linux/Mac
pipeline_env\Scripts\activate # Windows
激活后,终端前面会出现(pipeline_env)的提示。这时候你pip install的所有包,都只在这个环境里生效。
.venv文件夹,然后让IDE自动识别。这样团队协作时,每个人都能快速拉起自己的环境。
2.2 Docker容器化:让环境可移植
虚拟环境解决了本机隔离的问题,但换台机器呢?换个人呢?Docker就是终极方案——把整个环境打包成一个镜像,走到哪跑到哪。
我在项目中遇到过最头疼的事:开发环境好好的,一部署到测试服务器就报错。后来用Docker,再也没出过这种问题。
一个典型的Pipeline组件Dockerfile长这样:
FROM python:3.10-slim
WORKDIR /app
# 先装系统依赖
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*
# 复制依赖文件
COPY pyproject.toml poetry.lock ./
# 安装Python依赖
RUN pip install poetry && poetry install --no-dev
# 复制源码
COPY . .
CMD ["python", "main.py"]
.dockerignore写好,不然把.venv、__pycache__这些文件也打包进去,镜像会变得很臃肿。我曾经犯过这个错,一个镜像2个G,后来加了ignore文件,直接缩到200M。
2.3 Poetry:现代依赖管理工具
说到依赖管理,很多人还在用requirements.txt。但说实话,那玩意儿太原始了——版本冲突全靠手动解决,锁定文件也不够精确。
Poetry就不一样了。它把依赖声明、锁定、打包、发布全包了。而且用pyproject.toml统一管理,这才是Python社区的未来方向。
安装Poetry:
curl -sSL https://install.python-poetry.org | python3
初始化一个新项目:
poetry new pipeline-component
cd pipeline-component
poetry add requests pandas
你会看到pyproject.toml里自动写好了依赖声明,同时生成了poetry.lock锁定精确版本。团队其他人拉代码后,只需执行:
poetry install
就能得到一模一样的依赖环境。这才是真正的可复现构建。
- 自动解析依赖树,避免版本冲突
- 生成精确的锁定文件,保证环境一致
- 内置虚拟环境管理,不用手动激活
- 支持发布到PyPI,一条命令搞定
2.4 三者如何配合?
你可能要问了:虚拟环境、Docker、Poetry,到底用哪个?我的建议是——全都要。
日常开发时,用Poetry管理虚拟环境和依赖。写代码、跑测试都在这个环境里。等到要交付了,用Docker把整个环境打包成镜像,确保部署环境一致。
下面这张图展示了它们的分工与协作:
- 用
poetry new创建项目骨架 - 用
poetry add添加依赖,Poetry自动管理虚拟环境 - 开发完成后,写Dockerfile,基于Poetry的锁定文件构建镜像
- 用
docker-compose编排多个组件(比如Pipeline + Redis + PostgreSQL)
2.5 避坑指南
我曾经踩过几个坑,分享出来帮你省点时间:
- Poetry和系统Python版本冲突: 记得在
pyproject.toml里指定[tool.poetry.dependencies] python = "^3.9",不然Poetry可能给你装个不兼容的版本。 - Docker镜像太大: 尽量用
slim或alpine基础镜像。我有个项目从python:3.10换成python:3.10-slim,镜像从1.2G降到了300M。 - 虚拟环境路径写死: 别把
.venv提交到Git仓库。在.gitignore里加上.venv/,让每个人自己生成。
好了,环境搭建就聊到这儿。记住一个原则:开发环境要能一键拉起,部署环境要能一键复现。做到这两点,你的Pipeline组件开发之路就顺畅了一半。