为啥反序列化绘图时会出错?

Posted

技术标签:

【中文标题】为啥反序列化绘图时会出错?【英文标题】:Why does it give an error when deserializing the plot?为什么反序列化绘图时会出错? 【发布时间】:2022-01-24 05:30:53 【问题描述】:

问题如下。由MSSQL2019 sp_execute_external_script创建matplotlib图(代码在帖子末尾),然后将图序列化为字节序列并发送到Python脚本。然后在图回转换阶段出现错误:

runfile('C:/Users/Gamer/Desktop/Проект архив/Анализ данных/test_g_plot.py', wdir='C:/Users/Gamer/Desktop/Проект архив/Анализ данных') Traceback (最近一次通话最后):文件“C:\Users\Gamer\Desktop\Проект архив\Анализ данных\test_g_plot.py”,第 15 行,在 fig = pickle.loads(tables[i][0]) 文件“C: \ProgramData\Anaconda3\lib\site-packages\matplotlib\cbook_init_.py",第 195 行,在 setstate for s,d in self.callbacks.items() AttributeError: 'CallbackRegistry' object has no attribute 'callbacks'强>

SQL过程代码:

/****** Object:  StoredProcedure [dbo].[PyPlotMatplotlib]    Script Date: 22.12.2021 22:01:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[PyPlotMatplotlib]
AS
BEGIN
    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
import matplotlib
import pandas 
import pickle
import matplotlib.pyplot as plt

df = pandas.DataFrame("name": ["Earth", "Moon", "Mars"], "mass_to_earth": [1, 0.606, 0.107])
fig_handle = plt.figure()
plt.barh(df.name, df.mass_to_earth)
# plt.hist(df.mass_to_earth)
plt.xlabel("Tipped")
plt.ylabel("Counts")
plt.title("Histogram, Tipped")
#plt.savefig("1.png")

#plt.show()

plot = pandas.DataFrame(data =[pickle.dumps(fig_handle, 3)], columns =["plot"])
plt.clf()

OutputDataSet = plot
plt.clf()
'
WITH RESULT SETS ((plot varbinary(max)))
END

Python 代码:

# -*- coding: utf-8 -*-

import pyodbc
import pickle
import os
import pydbwork
import matplotlib.pyplot as plt

cnxn = pydbwork.connect_db("SNOUBORT", "TestPlot")
cursor = cnxn.cursor()
cursor.execute("EXECUTE [dbo].[PyPlotMatplotlib]")
tables = cursor.fetchall()
for i in range(0, len(tables)):
    fig = pickle.loads(tables[i][0])

# fig.show()
# fig.savefig('0.png')
# print("The plots are saved in directory: ",os.getcwd())

根据文章使用这种实现方式:click

因此绘图应该这样保存:enter image description here

【问题讨论】:

没有真正的想法,但你必须腌制,我腌制与完全相同版本的 Matplotlib。 感谢您的建议。脚本在python和matplotlib类似版本的环境中运行后确实可以正常运行(之前脚本是在更高版本的环境中运行的) 很高兴它有帮助,尽管我的手机导致拼写错误 【参考方案1】:

通过在 Python 和 matplotlib 版本类似于 SQL 的环境中运行脚本解决了问题

SQL 版本检查:

import sys
import matplotlib as plt
print(sys.version)
print(plt.__version__)

3.7.1(默认,2018 年 12 月 10 日,22:54:23)[MSC v.1915 64 位 (AMD64)]

3.0.2

检查环境版本:

# -*- coding: utf-8 -*-
import sys
import matplotlib as plt
print(sys.version)
print(plt.__version__)

3.7.11(默认,2021 年 7 月 27 日,09:42:29)[MSC v.1916 64 位 (AMD64)]

3.0.2

感谢 Jody Klymak 提供有用的建议和解决此问题的方法。

【讨论】:

以上是关于为啥反序列化绘图时会出错?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我使用 JSON.NET 反序列化时会忽略我的默认值?

无法反序列化当前的JSON对象,为啥

使用 DataContractSerializer 反序列化 XML 时出错

反序列化为啥要找公开方法

比较冷门但是偏底层

当我尝试从 c# 中的 url 反序列化时出错