2015-01-24 48 views
8

Próbuję zainstalować xadmin (jest to wtyczka django do użycia backoffice z bootstrapem twittera). Ale kiedy uruchomić mój projekt, mam następujący błąd w moim terminalu pycharm:AttributeError: Obiekt 'module' nie ma atrybutu 'setdefaultencoding'

File "C:\Python34\lib\site-packages\xadmin\sites.py", line 10, in <module> 
sys.setdefaultencoding("utf-8") 
AttributeError: 'module' object has no attribute 'setdefaultencoding' 

Jest to ekstrakt z kodu źródłowego od sites.py w wtyczce xadmin:

import sys 
from functools import update_wrapper 
from django.conf import settings 
from django.core.exceptions import ImproperlyConfigured 
from django.db.models.base import ModelBase 
from django.views.decorators.cache import never_cache 
from imp import reload 

reload(sys) 
sys.setdefaultencoding("utf-8") 

Projekt jest uruchomiony z interpreterem Pythona 3.4 i Django 1.7.1. Wersja xadmin to 0.5.0

Co mogę zrobić?

+0

OK, myślę, że domyślnie będę zachowywał administratora django ... Dzięki za pomoc faceci –

Odpowiedz

22

Python 3 nie ma funkcji sys.setdefaultencoding(). Nie może być przywrócone przez reload(sys), podobnie jak na Pythonie 2 (którego tak naprawdę nie powinno się robić w żadnym wypadku).

Ponieważ domyślnym Pythona 3 UTF-8 już, nie ma sensu pozostawienie tych stwierdzeń w.

W Pythonie 2, stosując sys.setdefaultencoding() użyto do gipsu na ukrytych problemów kodowania (spowodowane przez concatening ciągi bajtów i wartości Unicode oraz inne takie mieszane sytuacje), zamiast samodzielnie naprawiać problemy. Python 3 wyeliminował niejawne kodowanie i dekodowanie, więc użycie gipsu do ustawienia innego kodowania i tak nie miałoby znaczenia.

Jednakże, jeśli jest to biblioteka 3rd-party, to prawdopodobnie będzie działać w innych problemów, jak to wyraźnie nie poczyniono kompatybilny z Pythona 3.

+0

Czy 'getdefaultencoding' również jest wyrzucony w Py3? –

+0

@BhargavRao, nie, jest tam i zwraca '' utf-8''. –

+0

@BhargavRao: 'sys.getdefaultencoding()' nadal tam jest. –

6

Oczywiście projekt xadmin jest ściśle Python-2. Można załatać, że jeden plik łatwo, wystarczy włączyć dwa ostatnie wiersze w

if sys.version[0] == '2': 
    reload(sys) 
    sys.setdefaultencoding("utf-8") 

i wysłać niewielką poprawkę do opiekunów xadmin. Jednak jest bardzo mało prawdopodobne, że jest to bit w pakiecie, który nie jest kompatybilny z Pythonem 3 - bez wątpienia natrafisz później na dalsze, subtelniejsze. Najlepiej napisać do opiekunów xadmin z pytaniem, jakie są plany, aby uczynić ją zgodną z Py 3 i pomóc w tym zadaniu.

+0

Zdecydowanie wolę, aby opiekunowie nie używali 'sys.setdefaultencoding()' * w ogóle *, ponieważ ustawienie domyślnego kodowania może złamać biblioteki stron trzecich i generalnie powinno się ich unikać. –

+0

@MartijnPieters, ale, o ile nie zaproponujesz ponownego zaprojektowania całego kodu dla Pythona 2, podejrzewam, że doskonałe rady nie będą przestrzegane. Przejście na kompatybilność z Pythonem 3 to zadanie warte wysiłku, niż poprawa jakości pakietu z punktu widzenia stricte Python 2, tak czy inaczej :-). –

+0

Uzgodnione. Linie zostały dodane w [wstępnym zatwierdzeniu] (https://github.com/sshwsfc/django-xadmin/commit/c653ad8a4d255b11dc1c0a44e9507e15e82f03ad), więc najprawdopodobniej było to włączenie do kultu Cargo, a nie świadomy wybór. –

Powiązane problemy