2012-01-10 7 views
5

usando Python 3.2 en Windows 7 me estoy haciendo lo siguiente en IDLE:UnicodeEncodeError cuando se utiliza la función de compilación

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

¿Alguien puede explicar por qué la declaración de compilación intenta convertir el nombre de archivo Unicode MBCS utilizando? Sé que sys.getfilesystemencoding devuelve 'mbcs' en Windows, pero pensé que esto no se usa cuando se proporcionan nombres de archivos Unicode.

por ejemplo:

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

obras.

Para una prueba más completa guardar lo siguiente en un archivo codificado UTF-8 y ejecutarlo usando la versión estándar 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) 

Salida:

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

intentado localmente en XP y recuperar un objeto de código adecuado. ¿Se está ejecutando desde la CLI o se ejecuta a través de un archivo? – monkut

+0

Voy a adivinar que no es la firma de llamada el problema, sino el contenido del archivo que causa el error Unicode. Verifique que "module1.py" esté codificado correctamente, con la firma de codificación asignada. – monkut

+0

@monkut: en Python 3.x, no tiene que preocuparse por la codificación: si hay caracteres UTF-8 en el archivo, se representarán como caracteres UTF-8. – Makoto

Respuesta

5

De Python issue 10114, parece que la lógica es que todos los nombres de archivos utilizados por Python deberían ser válidos para la plataforma donde se usan. Está codificado utilizando la codificación del sistema de archivos para ser utilizado en el C interno de Python.

Acepto que probablemente no debería arrojar un error en Windows, porque cualquier nombre de archivo Unicode es válido. Es posible que desee presentar un informe de error con Python para esto. Pero tenga en cuenta que los cambios necesarios pueden no ser triviales, ya que cualquier código C que use el nombre del archivo tiene que tener algo que hacer si no se puede codificar.

+0

Una pregunta relacionada es por qué en la última versión de Windows la codificación del sistema de archivos aún debe ser mbcs. – PyScripter

+0

@PyScripter: ¿Debería ser algo más? –

+0

Debe ser UTF-16 al menos en las versiones modernas de Windows – PyScripter

1

aquí una solución que funcionó para mí: Issue 427: UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-6: ordinal not in range (128):

Si nos fijamos en el archivo PyScripter ayuda en el tema "codificado Python Fuente archivos" (último párrafo) que le indica cómo configurar Python para admite otras codificaciones modificando el archivo site.py. Este archivo es en el subdirectorio lib del directorio de instalación de Python. Busque la función setencoding y asegúrese de que la configuración de compatibilidad con el entorno local está activada. (Ver más abajo)

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

Creo que se podría tratar de cambiar el "\" en la ruta del archivo en "/", al igual que

de compilación ('pase', R'c: \ temp \ 工具 \ module1.py ' 'exec')

de compilación ('pase', R'c:/temp/工具 /module1.py', 'exec')

he conocido a una problema como tú, utilicé este método para resolver el problema. Espero que pueda funcionar con los tuyos

Cuestiones relacionadas