requirements.txt和虚拟环境搞不清——Python包管理
先说结论
核心原则:隔离环境+锁定版本。每个项目独立虚拟环境(venv/conda),版本用requirements.txt或poetry.lock锁定。生产绝不直接pip install。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
虚拟环境
# venv(Python内置)
python3 -m venv myenv && source myenv/bin/activate
pip install pandas==2.1.0
# conda(能管C库和系统依赖)
conda create -n myenv python=3.11
conda activate myenv
版本锁定
# requirements.txt
pip freeze > requirements.txt
pip install -r requirements.txt
# poetry(推荐新项目)
poetry add pandas@2.1.0
poetry lock # 锁定完整依赖树
poetry install # 按lock文件安装
大数据环境的包管理
| 场景 | 挑战 | 方案 |
|---|---|---|
| PySpark on YARN | Executor没装包 | conda-pack打包环境分发 |
| Airflow | 多DAG依赖冲突 | VirtualenvOperator隔离 |
| Databricks | 集群安装影响所有人 | Notebook级%pip install |
| EMR | 新集群要重装 | Bootstrap Action自动安装 |
# PySpark分发依赖
conda pack -n myenv -o myenv.tar.gz
spark-submit --archives myenv.tar.gz#env \
--conf spark.pyspark.python=env/bin/python my_job.py
实战踩坑:pip upgrade导致DAG全挂
在某短剧出海公司,pip install --upgrade requests把2.28升到2.31,3个DAG的oauth库不兼容2.31全部ImportError。回退后另一个DAG又需要2.31。
解决:① Airflow用PythonVirtualenvOperator隔离DAG环境;② 所有项目用poetry管理依赖;③ 生产禁止直接pip install,变更走CI/CD。
面试高频追问
追问一:pip和conda区别?
pip只管Python包从PyPI下载。conda管Python包+C库+系统依赖从Anaconda仓库下载。大数据场景conda更常用(NumPy底层C库用conda管理方便)。
追问二:Docker和虚拟环境关系?
虚拟环境只隔离Python包,Docker隔离整个OS环境。Docker比虚拟环境隔离更彻底。Airflow DockerOperator、Spark on K8s用Docker镜像。
追问三:依赖冲突怎么处理?
用pipdeptree查看依赖树找冲突点。poetry的依赖解析器可自动检测冲突。实在解不了用虚拟环境隔离。
总结
包管理讲三层:① 虚拟环境隔离;② 版本锁定(requirements.txt/poetry.lock);③ 大数据特殊挑战(PySpark用conda-pack、Airflow用虚拟环境隔离DAG)。能讲出pip upgrade导致DAG全挂的踩坑,面试官觉得你有生产级包管理意识。
下一篇聊Python编码问题:UnicodeDecodeError让ETL崩了。
你们怎么管理Python依赖?评论区聊聊~
关注「Wood聊大数据」| 9年大数据老兵,只讲大数据面试干货