pip跟npm一样,一个安装命令下,会安装好些个依赖包。我们通过如下命令可以查询所有安装包的版本:
pip list
还能指定某个相对路径,查询依赖包的版本:
pip list --path ./lib
还能将当前的版本列表导出到文件:
pip freeze --path ./lib > requirement.txt
但这些都不足以解决我们真实面对的问题,即版本冲突问题。pip会告诉我们版本发生冲突了,但是它并不会告诉我们到底我是因为安装了哪些包导致的冲突,即包依赖树的根是谁。
解决版本冲突的大杀器就是pipdeptree,它能以树状结构列表冲突原因是什么,安装很容易:
pip install pipdeptree
列出整个安装包依赖树为:
pipdeptree -a
查询具体某个包的依赖树为:
pipdeptree --packages apache-airflow
查询结果列出了版本要求,以及当前安装的版本,部分结果如下:
apache-airflow==2.2.3
- alembic [required: >=1.5.1,<2.0, installed: 1.5.8]
- Mako [required: Any, installed: 1.1.4]
- MarkupSafe [required: >=0.9.2, installed: 2.0.1]
- python-dateutil [required: Any, installed: 2.8.2]
- six [required: >=1.5, installed: 1.16.0]
- python-editor [required: >=0.3, installed: 1.0.4]
- SQLAlchemy [required: >=1.3.0, installed: 1.3.24]
- apache-airflow-providers-ftp [required: Any, installed: 1.0.1]
- apache-airflow-providers-http [required: Any, installed: 1.1.1]
- apache-airflow-providers-imap [required: Any, installed: 1.0.1]
...
pipdeptree不支持--path参数,所以如果要添加特定的搜索路径,就需要:
export PYTHONPATH=`pwd`/lib/:$PYTHONPATH
同时,输出结果可以生成不同格式的图片,或者json格式。