GAE

2013-01-22 12 views
11

में matplotlib का उपयोग करना मेरे टैग और शीर्षक मेरी समस्या को स्पष्ट रूप से बताते हैं। मैं Google App Engine में रीयल-टाइम प्लॉट बनाने के लिए matplotlib का उपयोग करना चाहता हूं। मैंने documentation पढ़ा है और एसओ और Google पर खोज की है। मुझे this working demo पर इशारा करते हुए एक पोस्ट मिली। लेकिन जब मैं इसे अपने आप कोशिश करता हूं, तो यह मेरे लिए काम नहीं करता है।GAE

मैं एक साधारण आवेदन बनाया है, केवल एक हैंडलर स्क्रिप्ट 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()) 

और आ विन्यास फाइल 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" 

मैं कुछ प्लॉट करने के लिए चाहते हैं और फिर सामग्री को पीएनजी-छवि के रूप में वापस करें। यह प्रक्रिया अपाचे या आईआईएस जैसे सामान्य वेब-सर्वर के लिए ठीक काम करती है, मैंने इसे दस लाख बार किया था।

समस्या यह है कि: जब मैं विकास सर्वर के भीतर स्थानीय रूप से अपनी स्क्रिप्ट चलाता हूं, तो मुझे एक त्रुटि मिलती है जो शायद मेरे एमपीएल संस्करण 1.1.1 के कारण है, जो जीएई में केवल "प्रयोगात्मक" है। लेकिन जब मैं अपने ऐप को जीएई में तैनात करता हूं, तो मुझे पूरी तरह से अलग, असंबद्ध त्रुटि मिलती है।

दिखता है को देखते हुए, ट्रैस है:

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 

यह एमपीएल के फोंट-कैश के साथ कुछ करने के लिए लगता है। मैंने दस्तावेज़ों में पढ़ा है कि कैशिंग और फ़ाइल-पहुंच जीएई में एमपीएल के साथ समस्याओं में से एक है, लेकिन जाहिर है, आयात दूसरों के लिए काम करता है।

मैं क्या गलत कर रहा हूं?

संपादित नीचे जवाब के आधार पर, मैं

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) 

और इस तरह, यह काम कर रहा होने के लिए मेरी कोड बदल दिया है।

+0

स्पष्ट होने के लिए, यह स्थानीयहोस्ट के तहत विफल रहता है? और आपने अपनी ऐप.यामल फ़ाइल कहां से प्राप्त की? (पायथन 7 सामान्य रूप से मुख्य स्क्रिप्ट को hello_world.app के रूप में कॉल करता है) –

+0

मैंने इसे "प्रारंभ करना" मार्गदर्शिका के अनुसार बनाया है। मैं मैनुअल के अनुसार इसे 2.7-संस्करण में माइग्रेट कर दिया। –

+0

यह लोकहोस्ट के तहत विफल रहता है और जब GAE पर तैनात किया जाता है। लेकिन: अपवाद और ट्रेसबैक अलग है। मैंने स्थानीय को शामिल नहीं किया क्योंकि मैं स्थानीय असंगतताओं को समस्या की संभावित उत्पत्ति के रूप में बाहर करना चाहता था। –

उत्तर

7

मैं sys मॉड्यूल से परिचित नहीं हूं। प्रश्न का उत्तर देने के लिए मैं webapp2 का उपयोग करना पसंद करता हूं।

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) 

वैकल्पिक रूप से, आप फ़ाइलों एपीआई के साथ Blobstore में sio.getvalue() लिख सकते हैं और बेस 64 में एन्कोड करने के लिए से बचने के लिए छवियों एपीआई की विधि get_serving_url() इस्तेमाल कर सकते हैं: यह एक काम कर हैंडलर है।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मेरी समस्या यह है कि मैं matplotlib भी आयात नहीं कर सकता। शायद मेरा ऐप कॉन्फ़िगरेशन समस्या है? तुम्हारा कैसा दिखता है –

+0

आपका ऐप.मैम दो चीजों को छोड़कर अच्छा दिखता है: hello_world।एपीपी ने @ लाइटररीफ और वेब पुस्तकालय 'पुस्तकालयों' में टिप्पणी के रूप में टिप्पणी की। यह स्क्रिप्ट केवल उत्पादन में काम करती है। –

+0

मैं इसे अपने नमूने के आधार पर काम करने में सफल रहा, हालांकि मैं वास्तव में HTML बनाना नहीं चाहता, लेकिन पीएनजी-फाइलें। मैं अपना कोड अपने प्रश्न से जोड़ दूंगा। –

2

समस्या यह थी कि आप matplotlib आयात करने से पहले MATPLOTLIBDATA और MPLCONFIGDIR पर्यावरण चर को अपने ऐप निर्देशिका में सेट कर रहे थे। चूंकि आपके पास अपनी ऐप निर्देशिका में कोई फोंट नहीं था, इसलिए यह किसी भी फोंट को लोड नहीं कर सका।