Thẻ và tiêu đề của tôi nêu rõ vấn đề của tôi. Tôi muốn sử dụng matplotlib để tạo các ô thời gian thực trong Google App Engine. Tôi đã đọc số documentation và tìm kiếm trên SO và Google. Tôi đã tìm thấy một bài đăng, trỏ đến this working demo. Nhưng khi tôi tự mình thử, nó không có tác dụng với tôi.Sử dụng matplotlib trong GAE
Tôi tạo ra một ứng dụng đơn giản, chỉ có duy nhất một handler-script 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())
và aa tập tin cấu hình 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"
Tôi muốn âm mưu một cái gì đó và sau đó trả lại nội dung dưới dạng png-image. Thủ tục này hoạt động tốt cho một máy chủ web bình thường như Apache hoặc IIS, tôi đã làm điều này một triệu lần.
Vấn đề là: khi tôi chạy tập lệnh cục bộ trong máy chủ phát triển, tôi gặp lỗi có thể do phiên bản MPL 1.1.1 của tôi, chỉ là "thử nghiệm" trong GAE. Nhưng khi tôi triển khai ứng dụng của mình lên GAE, tôi nhận được lỗi hoàn toàn khác, không tương quan.
Nhìn vào ngoại hình, traceback là:
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
Nó dường như có một cái gì đó để làm với các phông chữ-cache của MPL. Tôi đọc trong các tài liệu mà bộ nhớ đệm và truy cập tập tin là một trong những vấn đề với MPL trong GAE, nhưng rõ ràng, việc nhập khẩu hoạt động cho những người khác.
Tôi đang làm gì sai?
Sửa Dựa trên câu trả lời dưới đây, tôi đã thay đổi mã của tôi là
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)
và như thế này, nó làm việc.
Để rõ ràng, không thành công trong máy chủ cục bộ? và bạn lấy tệp app.yaml từ đâu? (Python 7 thường gọi kịch bản chính là hello_world.app) –
Tôi đã tạo nó theo hướng dẫn "Bắt đầu". Sau đó tôi di chuyển nó sang phiên bản 2.7 theo hướng dẫn. –
Không thành công trong máy chủ cục bộ và khi được triển khai sang GAE. Nhưng: ngoại lệ và traceback khác nhau. Tôi không bao gồm một địa phương như tôi muốn loại trừ không tương thích địa phương như là một nguồn gốc có thể của vấn đề. –