2016-10-10 17 views
-1

我正在使用Python 3和Flap与Matplotlib和numpy。将生成的Matplotlib图插入到python3的Flask中

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

我尝试了其他地方提出的建议,例如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多次(在任何单页和数百页上),并将它们显示在网页上。我希望避免生成文件,然后我必须清理,因为我可能会生成大量文件,并且可能会随着数据库中的数据更改而变化。

+1

此错误意味着您必须使用'utf-8'或其他编码将字节'decode()'转换为字符串。问题是因为在Python2中'str'和'bytes'没有区别。 Python3使用'unicode'作为'str'。 – furas

+0

是的,但是其中的错误在matplotlib包内。我对它的访问是在'savefig(img)'调用中,我无法将其解码为字符串。我认为问题在于它之前的'img = io.StringIO()'行,但我不知道如何创建一个对象来保存图形并传递回渲染引擎。 – raf

+0

它是'img = io.StringIO()'行应该是'img = io.BytesIO()' – raf

回答

1

从这个stackoverflow question这是在上述问题的用于拍摄的代码包含以下:

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

如@furas poitned出来,Python3对待字节和字符串不同,以Python2。在很多Python 2的例子中,StringIO用于类似上面的情况,但在Python3中它不起作用。因此,我们需要修改如上所示:

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

看起来有效。

相关问题