2015-01-24 18 views
8

Cerco di installare xadmin (è un plugin di django per usare il backoffice con il bootstrap di twitter). Ma quando ho eseguito il mio progetto, ho il seguente errore nel mio terminale PyCharm:AttributeError: l'oggetto 'module' non ha attributo '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' 

Questo è l'estratto di codice sorgente da sites.py in plug 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") 

Il progetto è in esecuzione con l'interprete Python 3.4 e Django 1.7.1. La versione xadmin è 0.5.0

Cosa posso fare?

+0

Ok, penso che manterrò l'amministratore del django per impostazione predefinita ... Grazie per l'aiuto ragazzi –

risposta

22

Python 3 non ha la funzione sys.setdefaultencoding(). Non può essere ripristinato da reload(sys) come su Python 2 (cosa che in realtà non dovresti fare).

Poiché il difetto su Python 3 è UTF-8 già, non v'è alcun punto nel lasciare tali dichiarazioni.

In Python 2, utilizzando sys.setdefaultencoding() stato usato per stuccare problemi di codifica impliciti (causata da concatening stringhe di byte e valori unicode e altre situazioni di tipo misto), piuttosto che risolvere i problemi stessi. Python 3 ha eliminato la codifica e la decodifica implicite, quindi usare l'intonaco per impostare una codifica diversa non farebbe comunque differenza.

Tuttavia, se questa è una libreria di terze parti, allora probabilmente verrà eseguito in altri problemi, come è evidente che non è stato reso compatibile con Python 3.

+0

"getdefaultencoding" è stato eliminato in Py3? –

+0

@BhargavRao, no, è lì e restituisce ''utf-8''. –

+0

@BhargavRao: 'sys.getdefaultencoding()' è ancora lì. –

6

Chiaramente il progetto è rigorosamente xadmin Python-2. È possibile patch che un file con facilità, basta girare le ultime due righe in

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

e inviare la piccola patch per i manutentori di xadmin. Tuttavia è molto improbabile che questo sia il solo nel pacchetto bit che non è compatibile con Python 3 - senza dubbio ti imbatterai in altri più sottili più tardi. Quindi, è meglio scrivere ai manutentori di xadmin chiedendo quali sono i piani per renderlo compatibile con Py 3 e come si può aiutare con l'attività.

+0

Preferirei che i manutentori non usassero 'sys.setdefaultencoding()' * affatto * poiché l'impostazione della codifica predefinita può rompere le librerie di terze parti e in genere dovrebbe essere comunque evitata. –

+0

@MartijnPieters, certo, ma, a meno che tu non stia offrendo di riprogettare il loro intero codice per Python 2, sospetto che l'eccellente consiglio sia improbabile che venga seguito. Passare alla compatibilità con Python 3 è un compito che richiede più impegno che migliorare la qualità di un pacchetto da un punto di vista strettamente Python 2, comunque :-). –

+0

concordato. Le linee sono state aggiunte nel [commit iniziale] (https://github.com/sshwsfc/django-xadmin/commit/c653ad8a4d255b11dc1c0a44e9507e15e82f03ad), quindi era molto probabilmente un'inclusione Cargo Cult, piuttosto che una scelta consapevole. –

Problemi correlati