UnicodeDecodeError bei ImageFileField

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Hallo zusammen,

ich hab da ein kleines Problem mit einem ImageFileField.
Ich sags gleich...in der Development-Version auf meiner
Entwicklermaschine funktioniert es, aber auf meinem Server
mit Django 1.0.2 dann nicht mehr.

Also folgendes:

Code: Alles auswählen

object_images = Image.objects.filter(...)
IS24Export.export(object_images) 
Ich hole mir mit einem Filter bestimmte Objekte meiner Image-Klasse (Model), die auch ein ImageFile enthält, und übergebe den Rückgabewert bei dem Aufruf einer Funktion.

Code: Alles auswählen

class IS24Export(object):
    @staticmethod
    def export(object_images):
    
    ...

    for entry in object_images:
       z.write(entry.image.path, os.path.basename(entry.image.path))  
    z.close()

    ...

    return 0
In der aufgerufenen Funktion möchte ich gerne die ImageFiles der übergegeben Objekte einer ZIP-File hinzufügen, was auch wie gesagt
beim entwickeln funktioniert und jetzt auf dem Server nicht mehr.

Bei der Zeile

Code: Alles auswählen

z.write(entry.image.path, os.path.basename(entry.image.path)) 
kommt eben folgender Fehler:

Exception Type: UnicodeDecodeError
Exception Value: 'ascii' codec can't decode byte 0x81 in position 11: ordinal not in range(128)


Das hängt ja wohl ziemlich sicher am entry.image.path!??!

Jemand eine Ahnung woran das hängen könnte?
Eigentlich sind alle Dateien auch als UTL-8 erstellt, weswegen es mich
wundert wo jetzt das ascii herkommt.

Danke für Anregungen.
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Also ich habe jetzt definitv rausgefunden, dass es nicht an dem entry.image.path hängt. Das kann ganz normal ausgelesen werden.
Irgendwie muss der Fehler mit dem schreiben der ZIP-File zustande kommen!?

Könnte es sein, dass der Fehler bei Python Version 2.5 nicht mehr auftritt?

http://mail.python.org/pipermail/python ... 30896.html

Dieser Link scheint darauf hinzudeuten, dass es was mit Python 2.4 zu tun hat.
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Da ich mir nun ziemlich sicher sein kann, dass der Fehler mit python2.5 behoben ist.

Wie installiere ich dieses am Besten auf ein Debian Etch System?

Ich hatte es eben ganz einfach mit "apt-get install python2.5" versucht und den python-Symlink darauf gesetzt.

Das Problem ist, dass Django weiterhon mit Python 2.4 arbeitet, da es in den Site-Packages von Python 2.4 installiert ist. Genau sieht es mit der Python IMage Library aus. Wie kann man das relativ "schmerzfrei" umdoktern!?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Na indem man PIL und Django für Python 2.5 installiert.

Ich habe mir selbst einen Backport für Python 2.6 gemacht, die restlichen Packages habe ich in /usr/local via easy_install nachinstalliert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Ok also einfach nochmal wie zuvor installieren?
Und da man ja python-Symlink auf 2.5 hat passt das!?

Und wie installiere ich python 2.5 am Besten unter Debian?
Mit apt-get oder anders?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``aptitude install python2.5``
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

``aptitude install python2.5``
Gibt es da einen Unterschied zu "apt-get install python2.5"?

Gut und wenn ich das gemacht habe und Symlink für python auf 2.5 gesetzt habe. Kann ich dann Django ganz normal mit "sudo python setup.py install" nochmals installieren und dann wird es in den python2.5 site-packages installiert?

Aber wie stelle ich dann ein, dass auch nicht mehr python2.4, sondern python2.5 von Django verwendet wird?

Wie installiere ich die PIL für python2.5, da ich diese ursprünglich mal mit apt-get python-imaging installiert habe. Wird mir dann nicht gesagt, dass das Paket bereits existiert?

Entschuldige, dass ich sofrage aber ich will auf meinem Server im Netz nicht allzu sehr rumexperementieren und habe leider momentan keine Testmaschine zur Verfügung.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

ferix hat geschrieben:
``aptitude install python2.5``
Gibt es da einen Unterschied zu "apt-get install python2.5"?
Aptitude kann Abhängigkeiten besser auflösen, hat eine bessere UI, wird von den Debian-Leuten seit Woody oder so empfohlen, kann automatisch installierte Pakete automatisch auch wieder deinstallieren (apt-get kann das inzwischen auch, aber erst seit kurzem).
ferix hat geschrieben:Gut und wenn ich das gemacht habe und Symlink für python auf 2.5 gesetzt habe. Kann ich dann Django ganz normal mit "sudo python setup.py install" nochmals installieren und dann wird es in den python2.5 site-packages installiert?
Am einfachsten ist es, wenn du Python 2.5 installierst und eine Datei namens /usr/lib/python2.5/distutils/distutils.cfg erstellst, mit diesem Inhalt:

Code: Alles auswählen

[install]
install_lib = /usr/local/lib/python2.5/site-packages
install_scripts = /usr/local/bin
Das bedeutet nun, dass distutils ab jetzt in /usr/local installieren, wodurch /usr "sauber" bleibt. Danach installierst du easy_install für Python 2.5 und kannst dann via ``easy_install-2.5 PIL`` die PIL installieren und Django (je nachdem welche Version du willst. Ich habe mir einfach einen Mercurial-Clone in meinen Home-Ordner erstellt und dann einen Symlink in /usr/local/lib/python2.5/site-packages/django, falls du eine Release installieren willst gehts mittels easy_install auch)
ferix hat geschrieben:Aber wie stelle ich dann ein, dass auch nicht mehr python2.4, sondern python2.5 von Django verwendet wird?
Hängt ab wie du die Skripte aufrufst. Wenn du sie mittels ``python skriptname.py`` aufrufst, musst du dass in ``python2.5 skriptname.py`` ändern, wenn du sie mittels ``./skriptname.py`` aufrufst, musst du den Shebang anpassen.
ferix hat geschrieben:Wie installiere ich die PIL für python2.5, da ich diese ursprünglich mal mit apt-get python-imaging installiert habe. Wird mir dann nicht gesagt, dass das Paket bereits existiert?
Siehe oben.
ferix hat geschrieben:Entschuldige, dass ich sofrage aber ich will auf meinem Server im Netz nicht allzu sehr rumexperementieren und habe leider momentan keine Testmaschine zur Verfügung.
Dafür gibt es VMs :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Super vielen Dank für die Erklärung. Soweit verstanden.
Das bedeutet nun, dass distutils ab jetzt in /usr/local installieren, wodurch /usr "sauber" bleibt.
Wieso sollte man das so machen?
Nicht gut sein "Zeug" in usr/lib/ direkt installiert zu haben?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

ferix hat geschrieben:Nicht gut sein "Zeug" in usr/lib/ direkt installiert zu haben?
Nein, ich versuche lokale Anpassungen wirklich nur in /usr/local zu haben, der Rest von /usr ist die Sache des Paketmanagers. Wenn ich in /usr/local etwas verbocke, dann kann ich es löschen ohne Probleme zu bekommen. Und ich sehe auf im System gleich, was ich "lokal" angepasst habe.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Hängt ab wie du die Skripte aufrufst. Wenn du sie mittels ``python skriptname.py`` aufrufst, musst du dass in ``python2.5 skriptname.py`` ändern, wenn du sie mittels ``./skriptname.py`` aufrufst, musst du den Shebang anpassen.
Ähm gute Frage. Ich lasse Django über mod_wsgi laufen und rufe da ja keine spezifische Python-Datei auf.

Sieht so aus:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os, sys

sys.path.append('/var/www/vhosts/domain.de')
sys.path.append('/var/www/vhosts/domain.de/website')
os.environ['DJANGO_SETTINGS_MODULE'] = 'website.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Deswegen versteh ich jetzt nicht so ganz wie ich Django sagen soll, dass es Python 2.5 anstatt 2.4 verwendet!?!?

Weil die Änderung des Symlinks hilft da ja wohl nichts.

Im Übrigen finde ich es komisch, dass man Django für jede Python Version extra installiern muss :roll:

Achso un unter lokalen Anpassungen verstehst du solche Installationen wie Django, PIL, ... was nicht über aptitude oder so läuft?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

ferix hat geschrieben:Ähm gute Frage. Ich lasse Django über mod_wsgi laufen und rufe da ja keine spezifische Python-Datei auf.
Da müsstest du wohl mod_wsgi gegen Python 2.5 kompilieren, wenn dein System kein mod_wsgi für 2.5 mitbringt. Ich nutze mod_fcgid, da hat man das Problem nicht.
ferix hat geschrieben:Im Übrigen finde ich es komisch, dass man Django für jede Python Version extra installiern muss :roll:
Du kannst es ja auch nur einmal installieren und symlinken. Da Django keinen C-Code enthält, würde das wohl auch funktionieren. Aber wozu Django für Python-Versionen installieren die man sowieso nicht nutzt.
ferix hat geschrieben:Achso un unter lokalen Anpassungen verstehst du solche Installationen wie Django, PIL, ... was nicht über aptitude oder so läuft?
Ja, genau.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Da müsstest du wohl mod_wsgi gegen Python 2.5 kompilieren, wenn dein System kein mod_wsgi für 2.5 mitbringt. Ich nutze mod_fcgid, da hat man das Problem nicht.
Na klasse das übersteigt so langsam meine Linux-Kenntnisse. Ich sehe schon im neuen Jahr wenn ich in der Vollselbständigkeit lande werde ich versuchen mit der Administration nix mehr groß am Hut haben zu müssen ^^

http://www.aditsystems.de/

Ist ein deutscher Django-Hoster, den ich mal testen möchte.
Und momentan tuts gott sei dank auch noch Python 2.4 es drehte sich ganz ganz oben da nämlich um eine Website, die ohnehin auf einem externen Server und nicht von mir installiert wird. Ich wollte nur testen ^^

Aber wieso muss das auch so sch... umständlich sein Django zu sagen, dass es gefälligst python2.5 nehmen soll wenn man mod_wsgi nutzt!? :roll:
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Leonidas hat geschrieben:Da Django keinen C-Code enthält, würde das wohl auch funktionieren. Aber wozu Django für Python-Versionen installieren die man sowieso nicht nutzt.
Das wäre wohl, was die pyc Files betrifft, eine etwas doofe Idee ;)
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

ferix hat geschrieben:Aber wieso muss das auch so sch... umständlich sein Django zu sagen, dass es gefälligst python2.5 nehmen soll wenn man mod_wsgi nutzt!? :roll:
Das hat absolut null mit Django zu tun :roll:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

ferix hat geschrieben:
Da müsstest du wohl mod_wsgi gegen Python 2.5 kompilieren, wenn dein System kein mod_wsgi für 2.5 mitbringt. Ich nutze mod_fcgid, da hat man das Problem nicht.
ferix hat geschrieben:Na klasse das übersteigt so langsam meine Linux-Kenntnisse. Ich sehe schon im neuen Jahr wenn ich in der Vollselbständigkeit lande werde ich versuchen mit der Administration nix mehr groß am Hut haben zu müssen ^^
So schwer ist das vermutlich nicht. Letztendlich ist das eben ein Nachteil den mod_wsgi mit mod_python teilt.
ferix hat geschrieben:http://www.aditsystems.de/

Ist ein deutscher Django-Hoster, den ich mal testen möchte.
Ich nutze Djangohosting. Die haben glaub ich Python 2.5, aber ich habe mir dort lokal 2.6 installiert und das tut relativ gut.
ferix hat geschrieben:Aber wieso muss das auch so sch... umständlich sein Django zu sagen, dass es gefälligst python2.5 nehmen soll wenn man mod_wsgi nutzt!? :roll:
Na weil mod_wsgi gegen eine spezifische Python-Version kompiliert wird und man das nur durch neukompilieren ändern kann.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten