【问题标题】:Inserting generated Matplotlib plots into Flask with python3使用 python3 将生成的 Matplotlib 图插入 Flask
【发布时间】:2017-02-18 10:01:10
【问题描述】:

我正在使用 Python 3 和 Flask 以及 Matplotlib 和 numpy。

我希望加载生成许多嵌入到页面中的图的页面。

我已尝试遵循其他地方提出的建议,例如 stackoverflow questiongithub 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 中 strbytes 之间没有区别。而Python3使用unicode作为str
  • 是的,但是错误在 matplotlib 包内。我对它的访问是在savefig(img) 调用中,我无法将其解码为字符串。我认为问题出在前面的img = io.StringIO() 行,但我不知道如何创建一个对象来保存图形并传回渲染引擎。
  • 这是img = io.StringIO() 行,应该是img = io.BytesIO()

标签: python python-3.x numpy matplotlib flask


【解决方案1】:

上述问题中使用的stackoverflow question 的代码包含以下内容:

    import StringIO
    ...
    fig = draw_polygons(cropzonekey)
    img = StringIO()
    fig.savefig(img)

正如@furas 指出的,Python3 对待字节和字符串的方式与 Python2 不同。在许多 Python 2 示例中,StringIO 用于上述情况,但在 Python3 中它将不起作用。因此,我们需要像这样修改上面的内容:

    import io
    ...
    fig = draw_polygons(cropzonekey)
    img = BytesIO()
    fig.savefig(img)

这似乎有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2023-04-01
    • 2019-09-19
    • 2014-08-29
    • 2014-11-07
    相关资源
    最近更新 更多