日常开发中我们会用pip list
查看安装了哪些包,直接以列表的形式展示给你,但是你知道某个包依赖于其它哪些包吗?或者你想删除一个包,它对应的依赖包会被同步删除吗?如果你有这些需求,可以继续往下看。
明确项目依赖(pipdeptree
)
pip list
或 pip freeze
打印出来的依赖有一个问题,就是并没有明确依赖关系。这样的坏处是,当我们想清理依赖的时候,就不知道到底哪些依赖是能被直接删除的、哪些依赖又是被间接依赖而不能轻易删除的。
例如我们可能在项目中用了 Flask
,但是我们可能不知道 Flask 也引用了 Jinja2
。这是我们如果擅自删除了 Jinja2
,项目就可能跑不起来。。。
这时就可以使用 pipdeptree
工具来管理依赖树:
安装pipdeptree
pip install pipdeptree
查看依赖树
$ pipdeptree
djangorestframework==3.13.1
- django [required: >=2.2, installed: 4.0.6]
- asgiref [required: >=3.4.1,<4, installed: 3.5.2]
- backports.zoneinfo [required: Any, installed: 0.2.1]
- sqlparse [required: >=0.2.2, installed: 0.4.2]
- tzdata [required: Any, installed: 2022.1]
- pytz [required: Any, installed: 2022.1]
Flask==2.1.3
- click [required: >=8.0, installed: 8.1.3]
- colorama [required: Any, installed: 0.4.5]
- importlib-metadata [required: >=3.6.0, installed: 4.12.0]
- zipp [required: >=0.5, installed: 3.8.1]
- itsdangerous [required: >=2.0, installed: 2.1.2]
- Jinja2 [required: >=3.0, installed: 3.1.2]
- MarkupSafe [required: >=2.0, installed: 2.1.1]
- Werkzeug [required: >=2.0, installed: 2.2.1]
- MarkupSafe [required: >=2.1.1, installed: 2.1.1]
fluent-logger==0.10.0
- msgpack [required: >1.0, installed: 1.0.4]
mysqlclient==2.1.1
pipdeptree==2.2.1
- pip [required: >=6.0.0, installed: 21.1.2]
requests==2.28.1
- certifi [required: >=2017.4.17, installed: 2022.6.15]
- charset-normalizer [required: >=2,<3, installed: 2.1.0]
- idna [required: >=2.5,<4, installed: 3.3]
- urllib3 [required: >=1.21.1,<1.27, installed: 1.26.11]
setuptools==57.0.0
wheel==0.36.2
这样我们就知道了,原来 Jinja2
是被 Flask 依赖的,这样我们就不会随便删除了。
项目依赖治理(pip-autoremove
)
那么问题来了,如果我忽然不想依赖 Flask 了,我们需要怎么做呢?
无脑的做法是 pip uninstall flask -y
。不那么显然的是,这其实不够优雅:
$ pip uninstall flask -y
...
$ pipdeptree
certifi==2020.6.20
click==7.1.2
itsdangerous==1.1.0
Jinja2==2.11.3
- MarkupSafe [required: >=0.23, installed: 1.1.1]
pipdeptree==2.0.0
- pip [required: >=6.0.0, installed: 19.3.1]
setuptools==44.0.0.post20200106
Werkzeug==1.0.1
wheel==0.36.2
发现没,Flask 虽然被卸载了,但是他的依赖包并没有卸载干净。你可能需要重新一个一个判断你是否需要剩下的包,然后再递归删除。
幸运的是,我们就可以用 pip-autoremove
工具来做这件事。我们重新安装Flask,再用这个工具删除试试:
$ pip install flask
$ pip install pip-autoremove
$ pip-autoremove flask -y
$ pipdeptree
certifi==2020.6.20
pip-autoremove==0.9.1
pipdeptree==2.0.0
- pip [required: >=6.0.0, installed: 19.3.1]
setuptools==44.0.0.post20200106
wheel==0.36.2
这下干净了
标签:依赖,log,python,required,扩展,installed,test,pip,pipdeptree From: https://www.cnblogs.com/amgulen/p/16981328.html