Das deutsche Python-Forum

10 Jahre Diskussionen rund um die Programmiersprache Python
Aktuelle Zeit: Freitag 29. August 2014, 12:07

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Donnerstag 10. Februar 2011, 16:08 
User

Registriert: Donnerstag 10. Februar 2011, 16:03
Beiträge: 7
Ich möchte gerne eine Png Datei aus einer sql Datenbank lesen und diese als Response an Werkzeug zurückgeben.

Leider erzeugt mein Programmcode folgenden Fehler:
"IOError: encoder png not available"

Pil wurde mit dem Windows Installer installiert, meine Platform ist python2.6 und WinXP.

Ich bin für jeden Rat dankbar :K

  1. #!/usr/bin/env python
  2. from werkzeug.wrappers import Request, Response
  3. try:
  4.     import sqlite3
  5. except ImportError:
  6.     from pysqlite2 import dbapi2 as sqlite3
  7.  
  8. import StringIO
  9. import Image
  10.  
  11. @Request.application
  12. def application(request):
  13.             conn = sqlite3.connect("photo.db")
  14.             sql = """SELECT image FROM photo LIMIT 1"""
  15.             cur = conn.cursor()
  16.             cur.execute(sql)
  17.             fp = StringIO.StringIO(cur.fetchone()[0])
  18.             bild = Image.open(fp)
  19.             response = bild.tostring("png")
  20.             return response
  21.  
  22. if __name__ == '__main__':
  23.     from werkzeug.serving import run_simple
  24.     run_simple('localhost', 4001, application)
  25.  
Highlighting by GeSHi


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Donnerstag 10. Februar 2011, 17:47 
User

Registriert: Mittwoch 9. Januar 2008, 14:48
Beiträge: 996
Der fehlte wohl beim Kompilieren von PIL die von PIL verwendete PNG-Library (ich vermute mal libpng). Installier die mal (im Zweifelsfall in der PIL-Doku nachschauen) und installiere PIL dann nochmal.

_________________
Icke auf GitHub


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Freitag 11. Februar 2011, 10:20 
User

Registriert: Donnerstag 10. Februar 2011, 16:03
Beiträge: 7
Leider dürfte es nicht an der Libary liegen.
Ich habe die vorkompilierte Version entfernt und PIL direkt vom Source explizit mit PNG unterstützung kompiliert.

Leider bekomme ich dennoch die selbe Fehlermeldung :?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Samstag 12. Februar 2011, 12:10 
Administrator
Benutzeravatar

Registriert: Freitag 20. Juni 2003, 17:30
Beiträge: 15924
Das Werkzeug-Skript neugestartet danach?

_________________
My god, it's full of CARs! | Leonidasvoice vs Modvoice


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Montag 14. Februar 2011, 10:13 
User

Registriert: Donnerstag 10. Februar 2011, 16:03
Beiträge: 7
Wie kann ich denn Werkzeug explizit neustarten?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Montag 14. Februar 2011, 11:05 
Moderator
Benutzeravatar

Registriert: Freitag 4. August 2006, 15:56
Beiträge: 6628
Wohnort: Hamburg
Indem Du das Script, beendest und es neu aufrufst ;-)

Da wir hier im dunkeln tappen, ein paar Vorschläge:
  • Poste doch mal den vollständigen Traceback!
  • Simuliere das Laden des Bildes doch mal in einem separaten Script oder der Shell

_________________
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Folien & Text inkl. Python3))


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Montag 14. Februar 2011, 11:36 
User

Registriert: Donnerstag 10. Februar 2011, 16:03
Beiträge: 7
Ja, das habe ich natürlich gemacht ;-)

Anbei der gesamte Traceback.

  1.  * Running on <!-- m --><a class="postlink" href="http://localhost:4001/">http://localhost:4001/</a><!-- m -->
  2. 127.0.0.1 - - [11/Feb/2011 09:18:56] "GET / HTTP/1.1" 500 -
  3. Error on request:
  4. Traceback (most recent call last):
  5.   File "C:\Python26\lib\site-packages\werkzeug-0.6.2-py2.6.egg\werkzeug\serving.py", line 153, in run_wsgi
  6.     execute(app)
  7.   File "C:\Python26\lib\site-packages\werkzeug-0.6.2-py2.6.egg\werkzeug\serving.py", line 140, in execute
  8.     application_iter = app(environ, start_response)
  9.   File "C:\Python26\lib\site-packages\werkzeug-0.6.2-py2.6.egg\werkzeug\wrappers.py", line 245, in <lambda>
  10.     return _patch_wrapper(f, lambda *a: f(*a[:-2]+(cls(a[-2]),))(*a[-2:]))
  11.   File "C:\Dokumente und Einstellungen\heinrich\workspace\test\src\testserv.py", line 19, in application
  12.     response = bild.tostring("png")
  13.   File "C:\Python26\lib\site-packages\PIL\Image.py", line 535, in tostring
  14.     e = _getencoder(self.mode, encoder_name, args)
  15.   File "C:\Python26\lib\site-packages\PIL\Image.py", line 401, in _getencoder
  16.     raise IOError("encoder %s not available" % encoder_name)
  17. IOError: encoder png not available
Highlighting by GeSHi

  • Ich kann das Bild mit einem anderen Script laden und anzeigen.
  • Ich kann es auch aus der Datenbank auslesen, im Filesystem ablegen und vom Filesystem wieder lesen.
  • Nur direkt aus der Datenbank kann ich es nicht anzeigen lassen.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Montag 14. Februar 2011, 11:44 
Moderator
Benutzeravatar

Registriert: Freitag 4. August 2006, 15:56
Beiträge: 6628
Wohnort: Hamburg
heinrich75 hat geschrieben:
  • Nur direkt aus der Datenbank kann ich es nicht anzeigen lassen.

Also der Fehler ist ja ganz eindeutig ein PIL-Fehler. Er kennt wohl "png" als Encoder nicht.

Und Du hast Dein separates Script auch auf derselben Maschine laufen lassen?

Und in dem kannst Du es auch nur aus einem File des Dateisystems laden und nicht per StringIO?

_________________
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Folien & Text inkl. Python3))


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Dienstag 15. Februar 2011, 16:14 
User

Registriert: Donnerstag 10. Februar 2011, 16:03
Beiträge: 7
Ich habe PIL mit der beigepackten selftest.py überprüft

python selftest.py
--------------------------------------------------------------------
PIL 1.1.7 TEST SUMMARY
--------------------------------------------------------------------
Python modules loaded from .\PIL
Binary modules loaded from .\PIL
--------------------------------------------------------------------
--- PIL CORE support ok
*** TKINTER support not installed
*** JPEG support not installed
--- ZLIB (PNG/ZIP) support ok
*** FREETYPE2 support not installed
*** LITTLECMS support not installed
--------------------------------------------------------------------

Zusätzlich habe ich eine neue Maschine installiert, welche nur Betriebsystem, Python 2.6, werkzeug und PIL installiert hat, jedoch ohne Erfolg.

Ja, das Filesystem Script lauft auf der selben Maschine, jedoch funktioniert auch hier nur das Speichern des PNG. Beim Lesen scheitert er ebenfalls.

Gibt es abgesehen von PIL eine andere Möglichkeit das Bild aus der Datenbank an Werkzeug weiterzugeben?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Dienstag 15. Februar 2011, 17:09 
User

Registriert: Mittwoch 9. Januar 2008, 14:48
Beiträge: 996
Eigentlich brauchst du ja PIL gar nicht dafür. Du willst ja keine Bilder bearbeiten. Nimm einfach die Daten aus der Datenbank und verwende sie direkt als Antwort.

_________________
Icke auf GitHub


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Dienstag 15. Februar 2011, 17:15 
Moderator
Benutzeravatar

Registriert: Freitag 4. August 2006, 15:56
Beiträge: 6628
Wohnort: Hamburg
Dauerbaustelle hat geschrieben:
Eigentlich brauchst du ja PIL gar nicht dafür. Du willst ja keine Bilder bearbeiten. Nimm einfach die Daten aus der Datenbank und verwende sie direkt als Antwort.

Als Lösung natürlich richtig. Dennoch ist es ja schon merkwürdig. Klingt für mich nach Bug. Speziell, da augenscheinlich das Speichern klappen soll und das Laden nicht...

_________________
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Folien & Text inkl. Python3))


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Dienstag 15. Februar 2011, 17:30 
User

Registriert: Donnerstag 10. Februar 2011, 16:03
Beiträge: 7
Mein Versuch ohne PIL, mit folgendem Code.

  1. #!/usr/bin/env python
  2. from werkzeug.wrappers import Request, Response
  3. try:
  4.     import sqlite3
  5. except ImportError:
  6.     from pysqlite2 import dbapi2 as sqlite3
  7.  
  8. import StringIO
  9. import Image
  10.  
  11. @Request.application
  12. def application(request):
  13.             conn = sqlite3.connect("osm.db")
  14.             sql = """SELECT image FROM osm LIMIT 1"""
  15.             cur = conn.cursor()
  16.             cur.execute(sql)
  17.             response = (cur.fetchone()[0])
  18.             return response
  19.  
  20. if __name__ == '__main__':
  21.     from werkzeug.serving import run_simple
  22.     run_simple('localhost', 4001, application)
  23.  
Highlighting by GeSHi


Erzeugt leider folgenden Trace.

  1. Traceback (most recent call last):
  2.   File "C:\Python26\lib\site-packages\werkzeug-0.6.2-py2.6.egg\werkzeug\serving.py", line 153, in run_wsgi
  3.     execute(app)
  4.   File "C:\Python26\lib\site-packages\werkzeug-0.6.2-py2.6.egg\werkzeug\serving.py", line 140, in execute
  5.     application_iter = app(environ, start_response)
  6.   File "C:\Python26\lib\site-packages\werkzeug-0.6.2-py2.6.egg\werkzeug\wrappers.py", line 245, in <lambda>
  7.     return _patch_wrapper(f, lambda *a: f(*a[:-2]+(cls(a[-2]),))(*a[-2:]))
  8. TypeError: 'buffer' object is not callable
Highlighting by GeSHi


Ich vermute auch einen Bug, ich habe jedoch keinen "aktuellen" Sourcecode von PIL gefunden. Habe daher die letzte Stabile Version 1.1.7 ist von 2009 verwendet.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Dienstag 15. Februar 2011, 17:38 
User

Registriert: Mittwoch 9. Januar 2008, 14:48
Beiträge: 996
Muss man da nicht ein Response-Objekt zurückgeben? Ich würde mir vielleicht für so einfache Webanwendungen mal Flask anschauen.

_________________
Icke auf GitHub


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Mit Werkzeug PNG aus sql Datenbank lesen und anzeigen
BeitragVerfasst: Dienstag 15. Februar 2011, 18:21 
User

Registriert: Donnerstag 10. Februar 2011, 16:03
Beiträge: 7
Danke für die zahlreichen Antworten, das Response Objekt war der entscheidende Hinweis ;-)

Folgender Code funktioniert

  1. #!/usr/bin/env python
  2. from werkzeug.wrappers import Request, Response
  3. try:
  4.     import sqlite3
  5. except ImportError:
  6.     from pysqlite2 import dbapi2 as sqlite3
  7.  
  8. import StringIO
  9. import Image
  10.  
  11. @Request.application
  12. def application(request):
  13.             conn = sqlite3.connect("osm.db")
  14.             sql = """SELECT image FROM osm LIMIT 1"""
  15.             cur = conn.cursor()
  16.             cur.execute(sql)
  17.             response = Response()
  18.             response.data = (cur.fetchone()[0])
  19.             response.headers['Content-Type'] = 'image/png'
  20.             return response
  21.  
  22. if __name__ == '__main__':
  23.     from werkzeug.serving import run_simple
  24.     run_simple('localhost', 4001, application)
  25.  
Highlighting by GeSHi


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Deutsche Übersetzung durch phpBB.de