订阅更新

requirements.txt和虚拟环境搞不清——Python包管理

Python手册 第 12 题 约 3 分钟读完

本文目录
  1. 先说结论
  2. 虚拟环境
  3. 版本锁定
  4. 大数据环境的包管理
  5. 实战踩坑:pip upgrade导致DAG全挂
  6. 面试高频追问
  7. 总结

先说结论

核心原则:隔离环境+锁定版本。每个项目独立虚拟环境(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 YARNExecutor没装包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年大数据老兵,只讲大数据面试干货

刷题进度保存在当前浏览器