2016-10-10 4 views
-1

Python 3とFlask with Matplotlibとnumpyを使用しています。生成されたMatplotlibプロットをPython3でFlaskに挿入

ページに埋め込まれた多数のプロットを生成するページを読み込みたいとします。

私は、このstackoverflow questionとこのgithub postのように、他の場所で行われた提案に従ってみました。

しかし、私がこの種のものを実装しようとすると、あらゆる種類のIO関連エラーが発生します。通常、フォームの:

TypeError: string argument expected, got 'bytes' 

との内部で生成されます。

site-packages/matplotlib/backends/backend_agg.py 

特に私はのpython3は、もはやエラーを生成されたものである、StringIO importを持って理解していないprint_png機能

、代わりにimport ioに電話してio.StringIO()と呼んでください。少なくともそれはわたしがやっていることだとわかっていますが、私が実際に見つけた例は得られません。

私の例の構造は、上記のstackoverflow質問の構造とほとんど同じです。ページはイメージルートを生成します。失敗するのは画像生成そのものです。

誰かが良いアイデアを持っている場合は、別の戦略を試してみてうれしいです。明らかにするには、私はプロットを生成する必要があります - データベース内のデータから何度も(100ページ以上のページで100以上)プロットを生成し、ウェブページ上に表示する必要があります。私はおそらく生成するファイルの数が多く、DB内のデータが変更されるとそれらが変更される可能性があるので、ファイルを生成しないようにしたいと考えていました。

+1

このエラーは、 'utf-8'または他のエンコーディングを使用してバイトから文字列に 'decode()する必要があることを意味します。問題は、Python2では 'str'と' bytes'の間に違いがなかったからです。そしてPython3は 'unicode'を' str'として使います。 – furas

+0

はい、ただし、エラーはmatplotlibパッケージ内にあります。私のそれへのアクセスは 'savefig(img)'コールにあり、それを文字列にデコードすることはできません。私は問題がそれに先行する 'img = io.StringIO()'行にあると仮定しますが、Figureを保存してレンダリングエンジンに戻すオブジェクトを作成する方法がわかりません。 – raf

+0

'img = io.StringIO()'行で 'img = io.BytesIO()'にする必要があります。 – raf

答えて

1

上記の質問に使用されるこのstackoverflow questionから採取されたコード次のものが含まれます@furasによってpoitnedよう

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

、のpython3は異なるPython2バイトと文字列を扱います。多くのPython 2の例では、StringIOは上記のような場合に使用されますが、Python3では動作しません。したがって、次のように上記を修正する必要があります。

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

これは動作するようです。

関連する問題