#!/usr/bin/python
import logging, os, StringIO, cgi
try: import webapp2
except: pass # when ran directly from command line
import subprocess
def no_popen(*args, **kwargs): raise OSError("forbjudet")
subprocess.Popen = no_popen # not allowed in GAE, missing from module
subprocess.PIPE = None
subprocess.STDOUT = None
os.environ["MATPLOTLIBDATA"] = os.getcwdu() # own matplotlib data
os.environ["MPLCONFIGDIR"] = os.getcwdu() # own matplotlibrc
import numpy, matplotlib, matplotlib.pyplot as plt
def dynamic_png():
try:
plt.title("Dynamic PNG")
for i in range(5): plt.plot(sorted(numpy.random.randn(25)))
rv = StringIO.StringIO()
plt.savefig(rv, format="png")
plt.clf()
return """<img src="data:image/png;base64,%s"/>""" % rv.getvalue().encode("base64").strip()
finally:
plt.clf()
def dynamic_svg():
try:
plt.title("Dynamic SVG")
for i in range(5): plt.plot(sorted(numpy.random.randn(25)))
rv = StringIO.StringIO()
plt.savefig(rv, format="svg")
return rv.getvalue().partition("-->")[-1]
finally:
plt.clf()
try: dynamic_png() # crashes first time because it can't cache fonts
except: logging.exception("don't about it")
if __name__ != "__main__":
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write("""<html><head><title>Numpy and Matplotlib on Google App Engine</title></head><body>""")
self.response.write(dynamic_png())
self.response.write(dynamic_svg())
self.response.write("<pre>%s</pre>" % cgi.escape(file(__file__.rstrip("c")).read())) # source, dev runs .py, gae runs .pyc
self.response.write("""</body> </html>""")
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)