python扩展包依赖管理

日常开发中我们会用pip list查看安装了哪些包,直接以列表的形式展示给你,但是你知道某个包依赖于其它哪些包吗?或者你想删除一个包,它对应的依赖包会被同步删除吗?如果你有这些需求,可以继续往下看。

明确项目依赖(pipdeptree

pip listpip 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

这下干净了😊。

在线日志fluent-logger

不知道大家开发中有没有跟我一样的情况,服务器没有权限,每次上线的项目问题排查日志都需要运维协助才能看日志,如果仅仅是排查日志,那我们是否可以将日志这块独立出来,统一放在某个系统里,方便我们查看,这当然可行,并且也有这样的扩展fluentd,貌似适配了各种开发语言,具体的也没详细了解,包括如何搭建fluentd服务也不是我这里要讲的内容,我要讲的只是如何将日志推送到指定已搭建好的fluentd服务上。

我们这里以django为例:

安装fluent-logger

pip install fluent-logger

配置log日志

formatters中的fluentdhandlers中的fluent_handlerloggers中的test都是我们用于演示的。

LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'standard': { 'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s' }, 'fluentd': { '()': 'fluent.handler.FluentRecordFormatter', 'format': { 'level': '%(levelname)s', 'hostname': '%(hostname)s', 'where': '%(module)s', } } }, 'handlers': { 'default': { 'level': 'WARNING', 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(BASE_DIR, 'log/my_handlers.log'), 'formatter': 'standard', } 'fluent_handler': { 'level': 'DEBUG', 'class': 'fluent.handler.FluentHandler', 'formatter': 'fluentd', 'tag': 'log.python.tonytest', # tag需要自定义以,需以log.开头 'host': 'fluentd服务ip', 'port': fluentd服务端口 } }, 'loggers': { 'default': { 'handlers': ['default'], 'level': 'WARNING', 'propagate': False, }, 'test': { 'handlers': ['fluent_handler'], 'level': 'DEBUG' } } }

如何使用

使用方式和你之前在文件中记录方式一致

import logging log_test = logging.getLogger("test") def test(request): log_test.info("log_test info异常") log_test.warning("log_test warning异常") log_test.error("log_test error异常") log_test.debug("log_test debug异常")

__EOF__

本文作者amgulen
本文链接https://www.cnblogs.com/amgulen/p/16981328.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   阿木古冷  阅读(145)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示