2012-01-10 15 views
5

Utilizzando Python 3.2 in Windows 7 Sto ottenendo il seguente in IDLE:UnicodeEncodeError quando si usa la funzione di compilazione

>>compile('pass', r'c:\temp\工具\module1.py', 'exec') 
UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: invalid character 

Qualcuno può spiegare perché la dichiarazione di compilazione tenta di convertire il nome del file unicode usando MBCS? So che sys.getfilesystemencoding restituisce 'mbcs' in Windows, ma ho pensato che questo non è usato quando vengono forniti nomi di file unicode.

ad esempio:

f = open(r'c:\temp\工具\module1.py') 

opere.

Per un test più completo salvare quanto segue in un file codificato utf8 ed eseguirlo utilizzando la versione standard di python.exe 3,2

# -*- coding: utf8 -*- 
fname = r'c:\temp\工具\module1.py' 
# I do have the a file named fname but you can comment out the following two lines 
f = open(fname) 
print('ok') 
cmp = compile('pass', fname, 'exec') 
print(cmp) 

uscita:

ok 
Traceback (most recent call last): 
    File "module8.py", line 6, in <module> 
    cmp = compile('pass', fname, 'exec') 
UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: inval 
id character 
+0

provato localmente in XP e ottenere un oggetto codice adeguato indietro. Viene eseguito dalla CLI o viene eseguito tramite un file? – monkut

+0

Ho intenzione di indovinare che non è la firma della chiamata il problema, ma il contenuto del file che causa l'errore Unicode. verificare che "module1.py" sia correttamente codificato, con la firma di codifica assegnata. – monkut

+0

@monkut: In Python 3.x, non ci si deve preoccupare della codifica: se nel file sono presenti caratteri UTF-8, verranno visualizzati come caratteri UTF-8. – Makoto

risposta

5

Da Python issue 10114, sembra che la logica è che tutti i nomi file utilizzati da Python dovrebbero essere validi per la piattaforma in cui vengono utilizzati. È codificato usando la codifica del filesystem da usare nelle parti interne di Python.

Sono d'accordo sul fatto che probabilmente non dovrebbe generare un errore su Windows, perché qualsiasi nome file Unicode è valido. Potresti voler presentare una segnalazione di bug con Python per questo. Ma sappi che le modifiche necessarie potrebbero non essere banali, perché qualsiasi codice C che usi il nome del file deve avere qualcosa da fare se non può essere codificato.

+0

Una domanda correlata è perché sull'ultima versione di Windows la codifica del file system deve essere ancora mbcs. – PyScripter

+0

@PyScripter: dovrebbe essere qualcos'altro? –

+0

Dovrebbe essere UTF-16 almeno nelle moderne versioni di Windows – PyScripter

1

Ecco una soluzione che ha funzionato per me: Issue 427: UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-6: ordinal not in range (128):

Se si guarda il file PyScripter aiuto nell'argomento "Encoded Python Fonte Files" (ultimo paragrafo) che ti dice come configurare Python per supporta altre codifiche modificando il file site.py. Questo file è nella sottodirectory lib della directory di installazione di Python. Trova la funzione setencoding e assicurati che le codifiche stringhe di default della console siano attive. (Vedi sotto)

def setencoding(): 
    """Set the string encoding used by the Unicode implementation. The 
    default is 'ascii', but if you're willing to experiment, you can 
    change this.""" 
    encoding = "ascii" # Default value set by _PyUnicode_Init() 
    if 0: <<<--- set this to 1 --------------------------------- 
     # Enable to support locale aware default string encodings. 
     import locale 
     loc = locale.getdefaultlocale() 
     if loc[1]: 
      encoding = loc[1] 
    if 0: 
     # Enable to switch off string to Unicode coercion and implicit 
     # Unicode to string conversion. 
     encoding = "undefined" 
    if encoding != "ascii": 
     # On Non-Unicode builds this will raise an AttributeError... 
     sys.setdefaultencoding (encoding) # Needs Python Unicode 
build ! 
0

Penso che si potrebbe provare a cambiare il "\" nel percorso del file in "/", proprio come

compilazione ('passaggio', r'c: \ temp \ 工具 \ module1.py ' 'exec')

compilazione ('passaggio', r'c:/temp/工具 /module1.py', 'exec')

ho incontrato un problema proprio come te, ho usato questo metodo per risolvere il problema. Spero possa funzionare con il tuo.

Problemi correlati