diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 28df51d..7da1954 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -442,18 +442,6 @@ These environment variables influence Python's behavior. import of source modules. -.. envvar:: PYTHONFSENCODING - - If this is set before running the interpreter, it overrides the encoding used - for the filesystem encoding (see :func:`sys.getfilesystemencoding`). - - This variable is not available (ignored) on Windows and Mac OS X: the - filesystem encoding is pinned to ``'mbcs'`` on Windows and ``'utf-8'`` on - Mac OS X. - - .. versionadded:: 3.2 - - .. envvar:: PYTHONIOENCODING If this is set before running the interpreter, it overrides the encoding used diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 2e7deec..c81c297 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -572,12 +572,6 @@ A number of small performance enhancements have been added: Filenames and Unicode ===================== -The filesystem encoding can be specified by setting the -:envvar:`PYTHONFSENCODING` environment variable before running the interpreter. -The value is an encoding name, e.g. ``iso-8859-1``. This variable is not -available (ignored) on Windows and Mac OS X: the filesystem encoding is pinned -to ``'mbcs'`` on Windows and ``'utf-8'`` on Mac OS X. - The :mod:`os` module has two new functions: :func:`~os.fsencode` and :func:`~os.fsdecode`. diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 342dada..768814c 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1172,36 +1172,6 @@ class FSEncodingTests(unittest.TestCase): continue self.assertEquals(os.fsdecode(bytesfn), fn) - def get_output(self, fs_encoding, func): - env = os.environ.copy() - env['PYTHONIOENCODING'] = 'utf-8' - env['PYTHONFSENCODING'] = fs_encoding - code = 'import os; print(%s, end="")' % func - process = subprocess.Popen( - [sys.executable, "-c", code], - stdout=subprocess.PIPE, env=env) - stdout, stderr = process.communicate() - self.assertEqual(process.returncode, 0) - return stdout.decode('utf-8') - - @unittest.skipIf(sys.platform in ('win32', 'darwin'), - 'PYTHONFSENCODING is ignored on Windows and Mac OS X') - def test_encodings(self): - def check(encoding, bytesfn, unicodefn): - encoded = self.get_output(encoding, 'repr(os.fsencode(%a))' % unicodefn) - self.assertEqual(encoded, repr(bytesfn)) - - decoded = self.get_output(encoding, 'repr(os.fsdecode(%a))' % bytesfn) - self.assertEqual(decoded, repr(unicodefn)) - - check('utf-8', b'\xc3\xa9\x80', '\xe9\udc80') - - # Raise SkipTest() if sys.executable is not encodable to ascii - support.workaroundIssue8611() - - check('ascii', b'abc\xff', 'abc\udcff') - check('iso-8859-15', b'\xef\xa4', '\xef\u20ac') - class PidTests(unittest.TestCase): @unittest.skipUnless(hasattr(os, 'getppid'), "test needs os.getppid") diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index fef0ed8..6eff9e2 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -885,10 +885,6 @@ class POSIXProcessTestCase(BaseTestCase): script = "import os; print(ascii(os.getenv(%s)))" % repr(key) env = os.environ.copy() env[key] = value - # Force surrogate-escaping of \xFF in the child process; - # otherwise it can be decoded as-is if the default locale - # is latin-1. - env['PYTHONFSENCODING'] = 'ascii' stdout = subprocess.check_output( [sys.executable, "-c", script], env=env) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 639c9b0..6e8aa25 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -602,35 +602,6 @@ class SysModuleTest(unittest.TestCase): expected = None self.check_fsencoding(fs_encoding, expected) - @unittest.skipIf(sys.platform in ('win32', 'darwin'), - 'PYTHONFSENCODING is ignored on Windows and Mac OS X') - def test_pythonfsencoding(self): - def get_fsencoding(env): - output = subprocess.check_output( - [sys.executable, "-c", - "import sys; print(sys.getfilesystemencoding())"], - env=env) - return output.rstrip().decode('ascii') - - # Raise SkipTest() if sys.executable is not encodable to ascii - test.support.workaroundIssue8611() - - # Use C locale to get ascii for the locale encoding - env = os.environ.copy() - env['LC_ALL'] = 'C' - try: - del env['PYTHONFSENCODING'] - except KeyError: - pass - self.check_fsencoding(get_fsencoding(env), 'ascii') - - # Filesystem encoding is hardcoded on Windows and Mac OS X - for encoding in ('ascii', 'cp850', 'iso8859-1', 'utf-8'): - env = os.environ.copy() - env['PYTHONFSENCODING'] = encoding - self.check_fsencoding(get_fsencoding(env), encoding) - - class SizeofTest(unittest.TestCase): diff --git a/Modules/main.c b/Modules/main.c index 4a10d93..c9499ac 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -99,9 +99,6 @@ static char *usage_5 = " The default module search path uses %s.\n" "PYTHONCASEOK : ignore case in 'import' statements (Windows).\n" "PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n" -#if !(defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)) && !defined(__APPLE__) -"PYTHONFSENCODING: Encoding used for the filesystem.\n" -#endif ; static int diff --git a/Modules/python.c b/Modules/python.c index 22fbdb5..540bcfe 100644 --- a/Modules/python.c +++ b/Modules/python.c @@ -41,7 +41,15 @@ main(int argc, char **argv) oldloc = strdup(setlocale(LC_ALL, NULL)); setlocale(LC_ALL, ""); for (i = 0; i < argc; i++) { - argv_copy2[i] = argv_copy[i] = _Py_char2wchar(argv[i]); +#ifdef __APPLE__ + /* Use utf-8 on Mac OS X */ + PyObject *unicode = PyUnicode_FromString(argv[i]); + argv_copy[i] = PyUnicode_AsWideCharString(unicode, NULL); + Py_DECREF(unicode); +#else + argv_copy[i] = _Py_char2wchar(argv[i]); +#endif + argv_copy2[i] = argv_copy[i]; if (!argv_copy[i]) return 1; } diff --git a/Python/pythonrun.c b/Python/pythonrun.c index a888a19..012c1b8 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -980,22 +980,12 @@ initfsencoding(void) char *codeset = NULL; if (Py_FileSystemDefaultEncoding == NULL) { - const char *env_encoding = Py_GETENV("PYTHONFSENCODING"); - if (env_encoding != NULL) { - codeset = get_codec_name(env_encoding); - if (!codeset) { - fprintf(stderr, "PYTHONFSENCODING is not a valid encoding:\n"); - PyErr_Print(); - } - } - if (!codeset) { - /* 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. Also set the encoding of - stdin and stdout if these are terminals. */ - codeset = get_codeset(); - } + /* 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. Also set the encoding of + stdin and stdout if these are terminals. */ + codeset = get_codeset(); if (codeset != NULL) { if (redecode_filenames(codeset)) Py_FatalError("Py_Initialize: can't redecode filenames");