Move initialization of sys.std{in,out}.encoding to Py_Initialize.
Verify that the encoding actually exists. Fixes #775985. Will backport to 2.3.
This commit is contained in:
parent
fc9b75fafb
commit
a2c17c5820
|
@ -77,7 +77,7 @@ static PyObject *warnings_module = NULL;
|
|||
If the module is returned, it is guaranteed to have been obtained
|
||||
without acquiring the import lock
|
||||
*/
|
||||
PyObject *PyModule_GetWarningsModule()
|
||||
PyObject *PyModule_GetWarningsModule(void)
|
||||
{
|
||||
PyObject *typ, *val, *tb;
|
||||
PyObject *all_modules;
|
||||
|
@ -142,6 +142,11 @@ Py_Initialize(void)
|
|||
PyThreadState *tstate;
|
||||
PyObject *bimod, *sysmod;
|
||||
char *p;
|
||||
#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
|
||||
char *codeset;
|
||||
char *saved_locale;
|
||||
PyObject *sys_stream, *sys_isatty;
|
||||
#endif
|
||||
extern void _Py_ReadyTypes(void);
|
||||
|
||||
if (initialized)
|
||||
|
@ -227,21 +232,52 @@ Py_Initialize(void)
|
|||
/* On Unix, set the file system encoding according to the
|
||||
user's preference, if the CODESET names a well-known
|
||||
Python codec, and Py_FileSystemDefaultEncoding isn't
|
||||
initialized by other means. */
|
||||
if (!Py_FileSystemDefaultEncoding) {
|
||||
char *saved_locale = setlocale(LC_CTYPE, NULL);
|
||||
char *codeset;
|
||||
setlocale(LC_CTYPE, "");
|
||||
codeset = nl_langinfo(CODESET);
|
||||
if (*codeset) {
|
||||
PyObject *enc = PyCodec_Encoder(codeset);
|
||||
if (enc) {
|
||||
Py_FileSystemDefaultEncoding = strdup(codeset);
|
||||
Py_DECREF(enc);
|
||||
} else
|
||||
PyErr_Clear();
|
||||
initialized by other means. Also set the encoding of
|
||||
stdin and stdout if these are terminals. */
|
||||
|
||||
saved_locale = setlocale(LC_CTYPE, NULL);
|
||||
setlocale(LC_CTYPE, "");
|
||||
codeset = nl_langinfo(CODESET);
|
||||
if (codeset && *codeset) {
|
||||
PyObject *enc = PyCodec_Encoder(codeset);
|
||||
if (enc) {
|
||||
codeset = strdup(codeset);
|
||||
Py_DECREF(enc);
|
||||
} else {
|
||||
codeset = NULL;
|
||||
PyErr_Clear();
|
||||
}
|
||||
setlocale(LC_CTYPE, saved_locale);
|
||||
} else
|
||||
codeset = NULL;
|
||||
setlocale(LC_CTYPE, saved_locale);
|
||||
|
||||
if (codeset) {
|
||||
sys_stream = PySys_GetObject("stdout");
|
||||
sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
|
||||
if (!sys_isatty)
|
||||
PyErr_Clear();
|
||||
if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
|
||||
if (!PyFile_SetEncoding(sys_stream, codeset))
|
||||
Py_FatalError("Cannot set codeset of stdin");
|
||||
}
|
||||
Py_XDECREF(sys_stream);
|
||||
Py_XDECREF(sys_isatty);
|
||||
|
||||
sys_stream = PySys_GetObject("stdout");
|
||||
sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
|
||||
if (!sys_isatty)
|
||||
PyErr_Clear();
|
||||
if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
|
||||
if (!PyFile_SetEncoding(sys_stream, codeset))
|
||||
Py_FatalError("Cannot set codeset of stdout");
|
||||
}
|
||||
Py_XDECREF(sys_stream);
|
||||
Py_XDECREF(sys_isatty);
|
||||
|
||||
if (!Py_FileSystemDefaultEncoding)
|
||||
Py_FileSystemDefaultEncoding = codeset;
|
||||
else
|
||||
free(codeset);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -905,9 +905,6 @@ _PySys_Init(void)
|
|||
#ifdef MS_WINDOWS
|
||||
char buf[10];
|
||||
#endif
|
||||
#if defined(HAVE_LANGINFO_H) && defined(CODESET)
|
||||
char *oldloc, *codeset;
|
||||
#endif
|
||||
|
||||
m = Py_InitModule3("sys", sys_methods, sys_doc);
|
||||
sysdict = PyModule_GetDict(m);
|
||||
|
@ -930,21 +927,6 @@ _PySys_Init(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_LANGINFO_H) && defined(CODESET)
|
||||
oldloc = setlocale(LC_CTYPE, 0);
|
||||
setlocale(LC_CTYPE, "");
|
||||
codeset = nl_langinfo(CODESET);
|
||||
setlocale(LC_CTYPE, oldloc);
|
||||
if(codeset && isatty(fileno(stdin))){
|
||||
if (!PyFile_SetEncoding(sysin, codeset))
|
||||
return NULL;
|
||||
}
|
||||
if(codeset && isatty(fileno(stdout))) {
|
||||
if (!PyFile_SetEncoding(sysout, codeset))
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
PyDict_SetItemString(sysdict, "stdin", sysin);
|
||||
PyDict_SetItemString(sysdict, "stdout", sysout);
|
||||
PyDict_SetItemString(sysdict, "stderr", syserr);
|
||||
|
|
Loading…
Reference in New Issue