为什么在反序列化图时会出错?
Why does it give an error when deserializing the plot?
问题如下。 MSSQL2019 sp_execute_external_script创建了一个matplotlib图(代码在post末尾),之后序列化为字节序列发送到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 行,在图中 = 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' 对象没有属性 '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
问题已通过 运行 脚本在 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 对这个问题的有用建议和解决方案。
问题如下。 MSSQL2019 sp_execute_external_script创建了一个matplotlib图(代码在post末尾),之后序列化为字节序列发送到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 行,在图中 = 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' 对象没有属性 '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
问题已通过 运行 脚本在 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 对这个问题的有用建议和解决方案。