在这里以类似的方式提出了这个问题,但是答案却是我的头(我是python和Web开发的新手),所以我希望有一个更简单的方法,或者可以用不同的方式解释它。
我正在尝试使用matplotlib生成图像并将其提供服务,而无需先将文件写入服务器。我的代码可能有点傻,但是它像这样:
import cgi import matplotlib.pyplot as pyplot import cStringIO #I think I will need this but not sure how to use ...a bunch of matplotlib stuff happens.... pyplot.savefig('test.png') print "Content-type: text/html\n" print """<html><body> ...a bunch of text and html here... <img src="test.png"></img> ...more text and html... </body></html> """
我认为不应该执行pyplot.savefig(’test.png’),而是创建一个cstringIO对象,然后执行以下操作:
mybuffer=cStringIO.StringIO() pyplot.savefig(mybuffer, format="png")
但是我从那里迷路了。我看到的所有示例(例如http://lost- theory.org/python/dynamicimg.html)都涉及类似的操作
print "Content-type: image/png\n"
而且我不知道如何将其与我已经输出的HTML集成在一起。
你应该
因此,如果发生错误savefig,您仍然可以返回其他内容,甚至另一个标头。有些错误不会更早地识别出来,例如文本问题,图像尺寸太大等。
savefig
您需要告诉savefig将输出写入何处。你可以做:
format = "png" sio = cStringIO.StringIO() pyplot.savefig(sio, format=format) print "Content-Type: image/%s\n" % format msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) # Needed this on windows, IIS sys.stdout.write(sio.getvalue())
如果要将图像嵌入HTML:
print "Content-Type: text/html\n" print """<html><body> ...a bunch of text and html here... <img src="data:image/png;base64,%s"/> ...more text and html... </body></html>""" % sio.getvalue().encode("base64").strip()