2013-01-22 30 views
11

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.

+0

Để 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) –

+0

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. –

+0

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 đề. –

Trả lời

7

Tôi không quen với mô-đun sys. Để đưa ra câu trả lời cho câu hỏi tôi thích sử dụng webapp2. Đây là một bộ xử lý làm việc:

import webapp2 
import StringIO 
import numpy as np 
import matplotlib.pyplot as plt 


class MainPage(webapp2.RequestHandler): 
    def get(self): 
     plt.plot(np.random.random((20))) 
     sio = StringIO.StringIO() 
     plt.savefig(sio, format="png") 
     img_b64 = sio.getvalue().encode("base64").strip() 
     plt.clf() 
     sio.close() 
     self.response.write("""<html><body>""") 
     self.response.write("<img src='data:image/png;base64,%s'/>" % img_b64) 
     self.response.write("""</body> </html>""") 

app = webapp2.WSGIApplication([('/', MainPage)], debug=True) 

Ngoài ra, bạn có thể viết các sio.getvalue() trong blobstore với các tập tin api và sử dụng phương pháp get_serving_url() hình ảnh api cho tránh để mã hóa trong base64.

+0

cảm ơn phản hồi của bạn. vấn đề của tôi là tôi thậm chí không thể nhập matplotlib. có lẽ cấu hình ứng dụng của tôi là vấn đề? làm thế nào để bạn nhìn? –

+0

app.yaml của bạn có vẻ ngoại trừ hai điều: hello_world.APP như nhận xét @peterretief và nhập webapp2 trong 'thư viện'. tập lệnh này chỉ hoạt động trong quá trình sản xuất. –

+0

Tôi đã thành công để làm cho nó hoạt động dựa trên mẫu của bạn, mặc dù tôi thực sự không muốn tạo HTML, nhưng là các tệp PNG. Tôi sẽ đính kèm mã của tôi vào câu hỏi của tôi. –

2

Vấn đề là bạn đã đặt các biến môi trường MATPLOTLIBDATAMPLCONFIGDIR vào thư mục ứng dụng của mình trước khi nhập matplotlib. Vì bạn không có bất kỳ phông chữ nào trong thư mục ứng dụng của mình nên nó không thể tải bất kỳ phông chữ nào.

Các vấn đề liên quan