Zap hat geschrieben:Hallo mathman. Ich habe bisher weder mit matplotlib noch mit bottle gearbeitet.
Aber was du da machst, macht meines Erachtens keinen Sinn.
Auf die Konsole schreiben heist nicht in den Speicher schreiben.
Versuche mal folgendes.
Code: Alles auswählen
from StringIO import StringIO
def schnittkraefte(...):
#...
io = StringIO()
plt.savefig(io, format='png')
return io.getvalue()
Nicht vergessen in der Doku von Bottle nachzugucken wie man den MIME-Type für den Response setzt.
Der client muss ja schließlich wissen das dort kein normaler Text kommt sondern ein Bild.
PS: Rebecca war schneller, ich wollte meinen Text aber einfach wieder wegschmeissen
Vielen Dank
ich hab mir in der Zwischenzeit ein weiteres Buch zu Gemüt geführt und wollte was zu StringIO erfahren. Stand zwar was drinne, aber war auch nicht die Welt ...
Jedenfalls hab ich mich in der Zwischenzeit mit StringIO versucht.
War auch fast so wie dein Lösungsvorschlag, außer das das ich den Rückgabewert nicht mit getvalue() gemacht hatte und dies von Bottel ausführen lassen wollte. Aufjedenfall kommt jetzt schon mal was außerhalb der Funktion an
Code: Alles auswählen
def schnittkraefte(traegertyp, I, Ecm, l1, l2, l3, g, q1, q2, q3):
import sys
import numpy
import matplotlib
#soll Antigrain Enginge zum Rendern nutzen
matplotlib.use('Agg')
import matplotlib.pyplot as plt
#Lib fuer Ramdatei
from StringIO import StringIO
...
#Ausgabe als Plot
#Plot x,y
s = StringIO()
plt.plot(ecz[:,0] , (ecz[:,2])*-1)
plt.ylabel('Moment [kN/m]')
plt.xlabel('Laenge [m]')
plt.title('Momentenverlauf')
plt.grid() # Gitternetz zeichnen
#return plt.savefig(sys.stdout, format='png')
plt.savefig(s, format='png')
return s.getvalue()
Das sollte schon funktioniere, jetzt ist das Problem auf Bottle zu verlagern.
Code: Alles auswählen
from bottle import route, run, static_file, debug
@route('/')
@route('/index.html')
def index():
from schnitt_test import schnittkraefte
s = schnittkraefte(3, 2.25, 26700000., 5, 10, 30, 10, 20, 20, 20)
return static_file(s, mimetype='image/png')
debug(True)
run(host='localhost', port=8080)
Da kommt es zu einem Fehler 500
Error 500: Internal Server Error
Sorry, the requested URL
http://localhost:8080/ caused an error:
Unhandled exception
Exception:
TypeError('static_file() takes at least 2 non-keyword arguments (1 given)',)
Traceback:
Traceback (most recent call last):
File "/home/mkoenig/workspace/sb2brain/src/bottle.py", line 499, in handle
return handler(**args)
File "/home/mkoenig/workspace/sb2brain/src/web_test_plot.py", line 10, in index
return static_file(s, mimetype='image/png')
TypeError: static_file() takes at least 2 non-keyword arguments (1 given)
Im Tutorial von Bottle wird auf statische Dateien eingegangen die man mittels
der Funktion "static_file(filename, root='/path/to/image/files', mimetype='image/png')"
an den Browser verschicken kann. Das habe ich probiert, außer das ich den root Pfad weg gelassen habe, da es keinen gibt da das Bild ja in der Ramdisk ist.
Jedenfalls bin ich überfragt wie man das Bild jetzt in den Browser bekommt.