PyYAML yaml.load(input)弃用

13 篇文章 1 订阅

本页说明了对PyYAML 5.1不推荐使用的纯yaml.load(input)函数。请参阅脚注。

不建议使用不指定参数 PyYAML的yaml.load功能。在PyYAML 5.1版中,您会收到警告,但是该功能仍然可以使用。请参阅下面的如何禁用警告。Loader=…

在PyYAML 5.1之前,PyYAML.load可以轻松利用该函数来调用任何Python函数。这意味着它可以使用调用任何系统命令os.system()。这是一个简单的示例:

python -c ‘import yaml; yaml.load("!!python/object/new:os.system [echo EXPLOIT!]")’
为什么不建议这样做?
load自2006年5月发布第一个版本以来,PyYAML的功能就一直是不安全的。它始终以粗体形式记录:PyYAMLDocumentation。PyYAML始终提供了无需safe_load加载即可加载YAML 子集的功能。

去年,CVE遭到了PyYAML的起诉,因为load即使有意设计和记录PyYAML从一开始就可以使用该功能,却可以利用该功能在不受信任的输入上利用CVE。CVE似乎建议默认情况下load使用safe_load。由于safe_load仅处理YAML的一个子集,并且PyYAML十多年来一直是非常流行的Python软件包,因此此更改不可行。

YAML是交叉编程语言,数据序列化语言。PyYAML是YAML的实现,它为Python提供了人类友好的(纯文本)数据序列化。Pickle是Python的本机(二进制)数据序列化格式。泡菜也是不安全的,因此需要大声记录。PyYAML的作者故意使其与Pickle兼容。

由于load不能破坏向后调用的兼容性safe_load,因此PyYAML的维护者决定简单地弃用的常规用法load,并要求用户有意声明所需的Loader。有4种装载机可供选择。见下文…

通过禁止默认加载程序(FullLoader)执行任意功能,该load函数也更加安全。

如何禁用警告
如果仅使用发出“ load()弃用”警告的Python软件,则应将其通知该软件的作者,以便他们进行和发布适当的调整。控制/禁用警告的一种方法是使用PYTHONWARNINGS环境变量:

PYTHONWARNINGS=ignore::yaml.YAMLLoadWarning
您可以PYTHONWARNINGS 在此处了解更多信息。

如果您是触发警告的Python代码的作者/维护者,则停止获取警告的最佳方法是Loader=像这样指定参数:

yaml.load(input, Loader=yaml.FullLoader)
当前的Loader选择是:

BaseLoader

仅加载最基本的YAML

SafeLoader

安全地加载YAML语言的子集。建议加载不可信的输入。

FullLoader

加载完整的YAML语言。避免执行任意代码。当前(PyYAML 5.1)是yaml.load(input)(在发出警告之后)调用的默认加载程序。

UnsafeLoader(也要求Loader向后兼容)

不受信任的数据输入可以轻易利用的原始Loader代码。

您也可以使用一种快捷的“糖”方法:

yaml.safe_load
yaml.full_load
yaml.unsafe_load
如果您是使用触发此警告的第三方模块的软件的作者/维护者,请首先确保对您的应用程序安全使用它们。确保他们知道警告。然后,您可以使用以下命令“全局”禁用警告:

yaml.warnings({‘YAMLLoadWarning’: False})
脚注
该页面将保持最新,有关load()弃用,用法和警告的最新信息。

警告消息指向https://msg.pyyaml.org/load,依次将您重定向到此处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Yolov5s.yaml是一个基于PyTorch框架的深度学习模型,它使用了一种称为"YOLO"(You Only Look Once)的目标检测算法。要画出它的网络结构图,可以按照以下步骤进行: 1. 首先,安装Graphviz和pydot这两个Python库。它们可以帮助我们将网络结构图可视化。 2. 在Python代码中导入必要的库,包括torch、yaml、graphviz、pydot等。 3. 加载yolov5s.yaml文件并解析其中的网络结构。可以使用PyYAML库将文件中的内容转换为Python字典。 4. 使用Graphviz库创建一个空的有向图,并添加节点和边来表示网络结构。可以根据不同的层类型(如卷积层、池化层、连接层等)设置不同的节点形状和颜色。 5. 将创建的有向图保存为PDF或PNG格式的图片文件。 下面是一个简单的Python代码示例,可以帮助您开始绘制yolov5s.yaml的网络结构图: ```python import torch import yaml from graphviz import Digraph import pydot # 加载yolov5s.yaml文件 with open('yolov5s.yaml') as f: model_def = yaml.load(f, Loader=yaml.FullLoader) # 创建一个新的有向图 dot = Digraph(comment='Yolov5s Network') # 添加输入节点 dot.node('input', label='Input\n(3, 640, 640)', shape='oval', style='filled', fillcolor='lightgray') # 遍历每一层并添加节点和边 for i, layer in enumerate(model_def['backbone']): layer_name = f'layer{i}' layer_type = layer['type'] layer_params = ', '.join([f'{k}={v}' for k, v in layer.items() if k != 'type']) # 添加节点 if layer_type == 'Conv': dot.node(layer_name, label=f'{layer_type}\n{layer_params}', shape='rectangle', style='filled', fillcolor='lightblue') elif layer_type == 'Bottleneck': dot.node(layer_name, label=f'{layer_type}\n{layer_params}', shape='diamond', style='filled', fillcolor='lightgreen') else: dot.node(layer_name, label=f'{layer_type}\n{layer_params}', shape='ellipse', style='filled', fillcolor='lightgray') # 添加边 if i == 0: dot.edge('input', layer_name) else: prev_layer_name = f'layer{i-1}' dot.edge(prev_layer_name, layer_name) # 添加输出节点 dot.node('output', label='Output\n(3, 80, 80)', shape='oval', style='filled', fillcolor='lightgray') prev_layer_name = f'layer{len(model_def["backbone"])-1}' dot.edge(prev_layer_name, 'output') # 保存图像文件 dot.format = 'pdf' dot.render('yolov5s_network', view=True) ``` 在上面的代码中,我们使用了Digraph类来创建一个新的有向图,并使用node()和edge()方法来添加节点和边。我们还使用了不同的形状和颜色来表示不同类型的层。最后,我们使用render()方法将图形保存为PDF格式的文件,并启动默认的PDF阅读器来查看图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值