This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author ideasman42
Recipients ideasman42
Date 2012-10-04.12:58:14
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <>
note, I was asked to report this issue, posted on the py dev mailing list: see -


We've run into an issue recently with blender3d on ms-windows where we
want to enforce the encoding is UTF-8 with the embedded python
(the encoding defaults to cp437).

I naively thought setting the environment variable before calling
Py_Initialize() would work, but the way python DLL loads, it gets its
own environment variables that cant be modified directly [1].
eg, _putenv("PYTHONIOENCODING=utf-8:surrogateescape");

We had bug reports by windows users not able to export files because
the stdout errors on printing paths with unsupported encoding. [2],[3]


Of course we could distribute blender with a bat file launcher that
sets env variables, or ask the user to set their env variable - but I
dont think this is really a good option.

I tried overriding the stderr & stdout, but this caused another bug on exiting, giving an assert in MSVCR90.DLL's write.c (called from python32_d.dll):

import sys, io
sys.__stdout__ = sys.stdout =
io.TextIOWrapper(, "wb", -1),
encoding='utf-8', errors='surrogateescape', newline="\n",
sys.__stderr__ = sys.stderr =
io.TextIOWrapper(, "wb", -1),
encoding='utf-8', errors='surrogateescape', newline="\n",

IMHO either of these solutions would be fine.

* have a PyOS_PutEnv() function, gettext has gettext_putenv() to
workaround this problem.

* manage this the same as Py_GetPythonHome(), which can be defined by
the embedding application to override the default.

Date User Action Args
2012-10-04 12:58:15ideasman42setrecipients: + ideasman42
2012-10-04 12:58:15ideasman42setmessageid: <>
2012-10-04 12:58:14ideasman42linkissue16129 messages
2012-10-04 12:58:14ideasman42create