python windows utf-8 latin1

Python con ruta PYTHONHOME no latina-1



title in python plot (2)

Creo que el problema es que internamente, Python2 procesa todo como cadenas de bytes en la codificación del sistema de plataforma que es (en Europa occidental) CP1252 una variante de Latin-1. Así que no es de extrañar que no pueda procesar correctamente una ruta PYTHONHOME que contenga otros caracteres

Pero, cuando era más joven, estaba acostumbrado al buen formato 8.3 de archivos MS / DOS ...

Todavía puedo ver (y usarlos) en un cuadro de Windows 7 con DIR /X en una ventana de consola (CMD.EXE). Este formato solo usa caracteres en mayúscula ASCII y tilda ( ~ ), por lo que podría usarse como una solución: simplemente declare la ruta 8.3 en la variable de entorno PYTHONHOME, e inicie python con esa ruta 8.3.

Por cierto, es aconsejable que PYTHONHOME use una ruta que no contenga caracteres especiales ni espacios. Podría funcionar, pero podría causar problemas con otros módulos

En mi caso incrustó Python en mi aplicación. Cuando la ruta de mi aplicación contiene un carácter que no es latin-1, Py_Initialize llama a exit (1) internamente ( más información más adelante ).

Así que verifiqué si puedo reproducir esto con el ejecutable de intérprete estándar.

Python-2.7.x en Windows no parece funcionar cuando la ruta de acceso de PYTHONHOME contiene un carácter fuera de latin-1 charset. El problema es que el sitio del módulo no se pudo encontrar e importar. Como las diéresis parecen funcionar, ¿cuál es la limitación real aquí? ¿Es solo compatible con latin-1? ¿Por qué funciona en OSX entonces?

C:/Users/ъ/Python27/python.exe // fails to start (KOI8-R) ^ C:/Users/ġ/Python27/python.exe // fails to start (latin-3) ^ C:/Users/ä/Python27/python.exe // works fine (latin-1) ^

¿Algunas ideas?

Fondo:

Todavía no he revisado el código, pero Python 2.6 y Python 2.7 también se comportan de manera diferente cuando el sitio no está disponible. Py 2.6 solo imprime un mensaje, Py 2.7 rechaza para comenzar.

static void initsite(void) { PyObject *m; m = PyImport_ImportModule("site"); if (m == NULL) { ... // Python 2.7 and later exit(1); // Python 2.6 and prior PyFile_WriteString("''import site'' failed; traceback:/n", f); } ... }

Python 2.7 : https://github.com/enthought/Python-2.7.3/blob/master/Python/pythonrun.c#L725

Python 2.6 : https://github.com/python-git/python/blob/master/Python/pythonrun.c#L705


Mirando la función PyImport_ImportModule , la versión 2.7 da esta definición:

PyObject * PyImport_ImportModule(const char *name) { PyObject *pname; PyObject *result; pname = PyString_FromString(name); if (pname == NULL) return NULL; result = PyImport_Import(pname); Py_DECREF(pname); return result; }

Al observar la función PyImport_ImportModule , la versión 3.5 da el mismo resultado, excepto con

pname = PyUnicode_FromString(name);

en lugar de

pname = PyString_FromString(name);

Puede ver el código de PyString_FromString y el código de PyUnicode_FromString pero parece claro que python 2 no utiliza Unicode y Python 3 sí, pero no he podido encontrar cómo / dónde exactamente esto lleva al comportamiento que describe.

La función PyImport_Import(module_name) (versión 2.7) solo usa module_name manera:

r = PyObject_CallFunction(import, "OOOOi", module_name, globals, globals, silly_list, 0, NULL);

pasando la responsabilidad ...