首页 > 编程语言 >【Python】可视化Python库的依赖关系

【Python】可视化Python库的依赖关系

时间:2024-03-24 21:47:56浏览次数:18  
标签:依赖 pyecharts name Python pipdeptree 可视化 depIndex depName append

这里主要用了两个库:pipdeptree和pyecharts。

pipdeptree用来解析所有库的依赖关系。

pyecharts用来显示依赖的网络关系。

通常的方法应该是通过输入下面命令:

pipdeptree --json-tree > pkg.json

得到关系树文件,然后解析该文件并在pyecharts显示即可。

不过我不想解析json文件了。

这里是直接输入pipdeptree命令,得到控制台输出,然后解析字符串来做的,比较暴力。

控制台输出为下面这种格式:

apturl==0.5.2
autopep8==2.0.2
├── pycodestyle [required: >=2.10.0, installed: 2.10.0]
└── tomli [required: Any, installed: 2.0.1]
bcrypt==3.2.0
blendmodes==2022
├── aenum [required: >=3.1.7,<4, installed: 3.1.12]
├── deprecation [required: >=2.1.0,<3, installed: 2.1.0]
│   └── packaging [required: Any, installed: 23.0]
├── numpy [required: >=1.22.1,<2, installed: 1.24.1]
└── Pillow [required: >=9.0.0,<10, installed: 9.0.1]

发现根据字符串中的"─"字符和该字符所在的位置,就能知道该库是根节点还是被第几层依赖的节点。

然后需要确定前后库的依赖连接,确定的方法也比较暴力,最后转为pyecharts输出即可。

代码如下:

from pyecharts.charts import Graph
from pyecharts import options as opts
import subprocess

# 调用系统命令并获取结果 pip install pipdeptree
result = subprocess.run('pipdeptree', capture_output=True, text=True)
output = result.stdout
output = output.split('\n')

depIndex = []
depName = []

for v in output:
    num = v.find('──')
    if num==-1:
        depIndex.append(0)
        name = v.split('==')
        depName.append(name[0])
    else:
        depIndex.append(num//4+1)
        name = v.split('──')
        name = name[1].split(' ')
        depName.append(name[1])

depIndex.pop()
depName.pop()
maxId = max(depIndex)

nodeNames =list(set(depName))

dicts={}
for nodeName in nodeNames:
    dicts[nodeName] = 5

links = []
while maxId!=0: 
    findMax = False  
    for i in range(len(depIndex)):
        if i!=0:
            if depIndex[i]==maxId:
                link = {"source":depName[i-1],"target":depName[i]}
                
                if link not in links:
                    dicts[depName[i]] = dicts[depName[i]] + 2

                links.append(link)
                depIndex.pop(i)
                depName.pop(i)
                findMax = True
                break
    if findMax==False:
        maxId= maxId-1

nodes = []
for nodeName in nodeNames:
    node = {"name":nodeName,"symbolSize":dicts[nodeName]}
    nodes.append(node)

graph = Graph(init_opts=opts.InitOpts(width="1920px", height="1080px"))
graph.add("", nodes, links)
graph.render('show.html')

所有连接效果如下,球越大代表被依赖的越多:

局部效果如下,选中节点后相关节点高亮:

标签:依赖,pyecharts,name,Python,pipdeptree,可视化,depIndex,depName,append
From: https://www.cnblogs.com/tiandsp/p/18093071

相关文章

  • Python问题异常处理与日志结合
    我们掌握了try-except来处理程序运行中可能遇到的异常,以及使用logging来记录程序运行日志,该篇文章就结合二者来讲讲如何记录程序运行过程中的各种事件、状态信息以及遇到的异常情况,以便于追踪、诊断和解决程序运行时的问题。目录一、配置日志记录器 (logging.Logger)二、......
  • 10个超实用的Python模板
    From: https://mp.weixin.qq.com/s/MCQIDYEXsp2v7RRsLaJ4JA-------------------------------------------------------------------------------------以下是10个超实用的Python模板,可以帮助您更快速地开始编写不同类型的代码:1.简单脚本模板:#!/usr/bin/env pythondef main......
  • 【进阶五】Python实现SDVRP(需求拆分)常见求解算法——自适应大邻域算法(ALNS)
    基于python语言,采用经典自适应大邻域算法(ALNS)对需求拆分车辆路径规划问题(SDVRP)进行求解。目录往期优质资源1.适用场景2.代码调整3.求解结果4.代码片段参考往期优质资源经过一年多的创作,目前已经成熟的代码列举如下,如有需求可私信联系,表明需要的问题与算法......
  • 如何使用Python编写网络程序来控制和交互物联网设备
    要使用Python编写网络程序来控制和交互物联网设备,你需要遵循以下步骤:选择合适的物联网设备:首先,你需要确定你想控制的物联网设备类型,例如智能灯泡、智能插座、温度传感器等,并了解其支持的通信协议(如MQTT,HTTP,CoAP等)。准备开发环境:确保你的计算机上安装了Python。根......
  • python案例
    1.针对数值运算符水仙花数是指一个3位数,它的每个位上的数字的3次幂之和等于它本身。例如:1^3+5^3+3^3=153。#水仙花数#方法一:foriinrange(100,1000):a=i//100b=(i-a*100)//10c=(i-a*100-b*10)ifi==pow(a,3)+......
  • python自动化——web自动化框架常用封装代码复习——当你会开发之后,发现一切都是如此
    PS:  PO模式知识点如下: 1、知识点:函数的书写、类、继承,模块导入; 2、思路:分层,抽离;     =====================================================================          编写用例基础版本:   pytest参数化,以及原始selenium用例编......
  • python安装教程
    打开国内的镜像网站Indexofpython-local/3.12.2(huaweicloud.com)找到如下图的程序下载即可。比官网的要快【我下载的是12.2的版本,你也可以根据自己的需求选择不同的版本】 下载完成之后就是安装了2.1双击下载的程序,出现如下界面 我们选择自定义安装路径2.2......
  • python趣味编程-使用 Django 和 WebSockets 的 Python 简单实时聊天室网站
    在Python中使用Django的简单实时聊天室系统该项目名为“简单实时聊天室系统”。这是一个使用Python和DjangoFramework开发的基于Web的应用程序。该应用程序是一个供随机用户使用的简单聊天室。所有人都可以在一个聊天框或对话框中进行交流。聊天消息会自动更新到所......
  • python趣味编程-使用 Django 的 Python 大学考勤管理系统
    在Python中使用Django的大学考勤管理系统该项目的名称为《大学考勤管理系统》。这是一个使用DjangoFramework用Python开发的基于Web的应用程序。该项目帮助某些大学学院存储/记录和管理学生每堂课的出勤情况。使用该应用程序,他们可以轻松列出班级学生名单并记录每......
  • python reqeusts 请求时headers指定content length后 请求不响应
    解释:HTTP头部中的Content-Length字段表示请求体的大小,用字节来表示。当你在使用Python的requests库进行请求时,如果你手动设置了Content-Length,但实际发送的请求体大小与Content-Length头部声明的大小不一致,服务器可能会认为这是一个无效的请求或者导致连接超时,因此服务器不会响应......