【发布时间】:2017-02-18 10:01:10
【问题描述】:
我正在使用 Python 3 和 Flask 以及 Matplotlib 和 numpy。
我希望加载生成许多嵌入到页面中的图的页面。
我已尝试遵循其他地方提出的建议,例如 stackoverflow question 和 github post。
但是,当我尝试实现任何类型的东西时,我会遇到各种与 IO 相关的错误。通常的形式:
TypeError: string argument expected, got 'bytes'
并在以下内部生成:
site-packages/matplotlib/backends/backend_agg.py
特别是print_png 函数
我知道 python3 不再有 StringIO import,这是产生错误的原因,而是我们将使用 import io 并用 io.StringIO() 调用它 - 至少这是我理解我们要做的,但是,我似乎无法找到我发现的任何示例。
我的示例的结构与上面列出的 stackoverflow 问题的结构几乎相同。页面生成与图像路由一样。只有图像生成本身失败。
如果有人有更好的主意,我很乐意尝试不同的策略。需要明确的是,我需要从数据库中的数据生成图表 - 有时很多(任何单个页面上 100+ 和数百页) - 并将它们显示在网页上。我希望避免生成我必须清理的文件,因为我可能会生成大量文件,而且它们可能会随着数据库中数据的变化而变化。
【问题讨论】:
-
此错误意味着您必须使用 'utf-8' 或其他编码将
decode()从字节转换为字符串。问题是因为在 Python2 中str和bytes之间没有区别。而Python3使用unicode作为str。 -
是的,但是错误在 matplotlib 包内。我对它的访问是在
savefig(img)调用中,我无法将其解码为字符串。我认为问题出在前面的img = io.StringIO()行,但我不知道如何创建一个对象来保存图形并传回渲染引擎。 -
这是
img = io.StringIO()行,应该是img = io.BytesIO()
标签: python python-3.x numpy matplotlib flask