From 5b519e02016ea3a51f784dee70eead3be4ab1aff Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 10 Sep 2010 21:57:59 +0000 Subject: Issue #9632: Remove sys.setfilesystemencoding() function: use PYTHONFSENCODING environment variable to set the filesystem encoding at Python startup. sys.setfilesystemencoding() creates inconsistencies because it is unable to reencode all filenames in all objects. --- Doc/library/sys.rst | 9 --------- Include/fileobject.h | 1 - Lib/test/test_sys.py | 11 ----------- Misc/NEWS | 5 +++++ Python/bltinmodule.c | 23 ----------------------- Python/sysmodule.c | 21 --------------------- 6 files changed, 5 insertions(+), 65 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 09dd844..ad61377 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -724,15 +724,6 @@ always available. :file:`/usr/include/dlfcn.h` using the :program:`h2py` script. Availability: Unix. -.. function:: setfilesystemencoding(enc) - - Set the encoding used when converting Python strings to file names to *enc*. - By default, Python tries to determine the encoding it should use automatically - on Unix; on Windows, it avoids such conversion completely. This function can - be used when Python's determination of the encoding needs to be overwritten, - e.g. when not all file names on disk can be decoded using the encoding that - Python had chosen. - .. function:: setprofile(profilefunc) .. index:: diff --git a/Include/fileobject.h b/Include/fileobject.h index 6e0e55e..20545fa 100644 --- a/Include/fileobject.h +++ b/Include/fileobject.h @@ -21,7 +21,6 @@ PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *); */ PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding; PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding; -PyAPI_FUNC(int) _Py_SetFileSystemEncoding(PyObject *); /* Internal API diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 8cfbaaf..639c9b0 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -630,17 +630,6 @@ class SysModuleTest(unittest.TestCase): env['PYTHONFSENCODING'] = encoding self.check_fsencoding(get_fsencoding(env), encoding) - def test_setfilesystemencoding(self): - old = sys.getfilesystemencoding() - try: - sys.setfilesystemencoding("iso-8859-1") - self.assertEqual(sys.getfilesystemencoding(), "iso-8859-1") - finally: - sys.setfilesystemencoding(old) - try: - self.assertRaises(LookupError, sys.setfilesystemencoding, "xxx") - finally: - sys.setfilesystemencoding(old) class SizeofTest(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS index 11a14f2..579fc04 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -29,6 +29,11 @@ Core and Builtins Library ------- +- Issue #9632: Remove sys.setfilesystemencoding() function: use + PYTHONFSENCODING environment variable to set the filesystem encoding at + Python startup. sys.setfilesystemencoding() creates inconsistencies because + it is unable to reencode all filenames in all objects. + - Issue #9410: Various optimizations to the pickle module, leading to speedups up to 4x (depending on the benchmark). Mostly ported from Unladen Swallow; initial patch by Alexandre Vassalotti. diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 3bcb08e..60bceb7 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -33,29 +33,6 @@ const char *Py_FileSystemDefaultEncoding = "utf-8"; int Py_HasFileSystemDefaultEncoding = 1; #endif -int -_Py_SetFileSystemEncoding(PyObject *s) -{ - PyObject *defenc, *codec; - if (!PyUnicode_Check(s)) { - PyErr_BadInternalCall(); - return -1; - } - defenc = _PyUnicode_AsDefaultEncodedString(s, NULL); - if (!defenc) - return -1; - codec = _PyCodec_Lookup(PyBytes_AsString(defenc)); - if (codec == NULL) - return -1; - Py_DECREF(codec); - if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) - /* A file system encoding was set at run-time */ - free((char*)Py_FileSystemDefaultEncoding); - Py_FileSystemDefaultEncoding = strdup(PyBytes_AsString(defenc)); - Py_HasFileSystemDefaultEncoding = 0; - return 0; -} - static PyObject * builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds) { diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 90c165a..4e428f0 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -199,25 +199,6 @@ operating system filenames." ); static PyObject * -sys_setfilesystemencoding(PyObject *self, PyObject *args) -{ - PyObject *new_encoding; - if (!PyArg_ParseTuple(args, "U:setfilesystemencoding", &new_encoding)) - return NULL; - if (_Py_SetFileSystemEncoding(new_encoding)) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} - -PyDoc_STRVAR(setfilesystemencoding_doc, -"setfilesystemencoding(string) -> None\n\ -\n\ -Set the encoding used to convert Unicode filenames in\n\ -operating system filenames." -); - -static PyObject * sys_intern(PyObject *self, PyObject *args) { PyObject *s; @@ -1012,8 +993,6 @@ static PyMethodDef sys_methods[] = { #ifdef USE_MALLOPT {"mdebug", sys_mdebug, METH_VARARGS}, #endif - {"setfilesystemencoding", sys_setfilesystemencoding, METH_VARARGS, - setfilesystemencoding_doc}, {"setcheckinterval", sys_setcheckinterval, METH_VARARGS, setcheckinterval_doc}, {"getcheckinterval", sys_getcheckinterval, METH_NOARGS, -- cgit v0.12