私のタグとタイトルは私の問題をはっきりと示しています。matplotlibを使用してGoogleAppEngineでリアルタイムプロットを作成したいと思います。ドキュメントを読み、SOとGoogleで検索しました。この実用的なデモを指す投稿を見つけました。しかし、私が自分でそれを試してみると、それは私にはうまくいきません。
ハンドラースクリプトhello_world.pyのみで構成される単純なアプリケーションを作成しました
import numpy as np
import os
import sys
import cStringIO
print "Content-type: image/png\n"
os.environ["MATPLOTLIBDATA"] = os.getcwdu() # own matplotlib data
os.environ["MPLCONFIGDIR"] = os.getcwdu() # own matplotlibrc
import matplotlib.pyplot as plt
plt.plot(np.random.random((20))) #imshow(np.random.randint((10,10)))
sio = cStringIO.StringIO()
plt.savefig(sio, format="png")
sys.stdout.write(sio.getvalue())
およびaa構成ファイルapp.yaml
application: helloworldtak
version: 1
runtime: python27
api_version: 1
threadsafe: no
handlers:
- url: /.*
script: hello_world.py
libraries:
- name: numpy
version: "latest"
- name: matplotlib
version: "latest"
何かをプロットしてから、コンテンツをpng-imageとして返したいです。この手順は、ApacheやIISなどの通常のWebサーバーで正常に機能します。これは、100万回実行しました。
問題はむしろ、開発サーバー内でローカルにスクリプトを実行すると、おそらくGAEでは「実験的」であるMPLバージョン1.1.1が原因であるエラーが発生します。しかし、アプリをGAEにデプロイすると、まったく異なる無相関のエラーが発生します。
外観を見ると、トレースバックは次のとおりです。
Traceback (most recent call last):
File "/base/data/home/apps/s~helloworldtak/1.364765672279579252/hello_world.py", line 16, in <module>
import matplotlib.pyplot as plt
File "/python27_runtime/python27_lib/versions/third_party/matplotlib-1.1.1/matplotlib/pyplot.py", line 23, in <module>
from matplotlib.figure import Figure, figaspect
File "/python27_runtime/python27_lib/versions/third_party/matplotlib-1.1.1/matplotlib/figure.py", line 18, in <module>
from axes import Axes, SubplotBase, subplot_class_factory
File "/python27_runtime/python27_lib/versions/third_party/matplotlib-1.1.1/matplotlib/axes.py", line 14, in <module>
import matplotlib.axis as maxis
File "/python27_runtime/python27_lib/versions/third_party/matplotlib-1.1.1/matplotlib/axis.py", line 10, in <module>
import matplotlib.font_manager as font_manager
File "/python27_runtime/python27_lib/versions/third_party/matplotlib-1.1.1/matplotlib/font_manager.py", line 1324, in <module>
_rebuild()
File "/python27_runtime/python27_lib/versions/third_party/matplotlib-1.1.1/matplotlib/font_manager.py", line 1278, in _rebuild
fontManager = FontManager()
File "/python27_runtime/python27_lib/versions/third_party/matplotlib-1.1.1/matplotlib/font_manager.py", line 995, in __init__
self.defaultFont['ttf'] = self.ttffiles[0]
IndexError: list index out of range
MPLのfonts-cacheで何かをしなければならないようです。キャッシュとファイルアクセスがGAEのMPLの問題の1つであることをドキュメントで読みましたが、明らかに、インポートは他の人にも機能します。
私は何が間違っているのですか?
編集 以下の回答に基づいて、コードを次のように変更しました
import numpy as np
import cStringIO
import matplotlib.pyplot as plt
import webapp2
class MainPage(webapp2.RequestHandler):
def get(self):
plt.plot(np.random.random((20)),"r-")
sio = cStringIO.StringIO()
plt.savefig(sio, format="png")
self.response.headers['Content-Type'] = 'image/png'
self.response.out.write(sio.getvalue())
app = webapp2.WSGIApplication([('/', MainPage)],
debug=True)
そしてこのように、それは働いています。