141
141
The use of intern() may defer breakage is but is not enough, the string
142
142
object should be secure against module reloading and during teardown.
144
is_py3 = sys.version_info > (3,)
146
147
old_ptr = ctypes.c_void_p.in_dll(ctypes.pythonapi,
147
148
"Py_FileSystemDefaultEncoding")
150
has_enc = ctypes.c_int.in_dll(ctypes.pythonapi,
151
"Py_HasFileSystemDefaultEncoding")
152
as_utf8 = ctypes.PYFUNCTYPE(
153
ctypes.POINTER(ctypes.c_char), ctypes.py_object)(
154
("PyUnicode_AsUTF8", ctypes.pythonapi))
148
155
except (ImportError, ValueError):
149
156
return # No ctypes or not CPython implementation, do nothing
150
new_ptr = ctypes.cast(ctypes.c_char_p(intern(new_enc)), ctypes.c_void_p)
151
old_ptr.value = new_ptr.value
158
new_enc = sys.intern(new_enc)
159
enc_ptr = as_utf8(new_enc)
162
new_enc = intern(new_enc)
163
enc_ptr = ctypes.c_char_p(new_enc)
164
old_ptr.value = ctypes.cast(enc_ptr, ctypes.c_void_p).value
152
165
if sys.getfilesystemencoding() != new_enc:
153
166
raise RuntimeError("Failed to change the filesystem default encoding")