[Python-checkins] cpython (merge 3.5 -> default): Issue #25339: PYTHONIOENCODING now has priority over locale in setting the

serhiy.storchaka python-checkins at python.org
Sun Apr 10 07:45:43 EDT 2016


https://hg.python.org/cpython/rev/9c6623099da1
changeset: 100902:9c6623099da1
parent: 100899:bb3cfca9c431
parent: 100901:56eca1c08738
user: Serhiy Storchaka <storchaka at gmail.com>
date: Sun Apr 10 14:35:21 2016 +0300
summary:
 Issue #25339: PYTHONIOENCODING now has priority over locale in setting the
error handler for stdin and stdout.
files:
 Lib/test/test_sys.py | 27 +++++++++++++++++++++++----
 Misc/NEWS | 3 +++
 Python/pylifecycle.c | 19 +++++++++----------
 3 files changed, 35 insertions(+), 14 deletions(-)
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
@@ -691,8 +691,10 @@
 args = [sys.executable, "-c", code]
 if isolated:
 args.append("-I")
- elif encoding:
+ if encoding is not None:
 env['PYTHONIOENCODING'] = encoding
+ else:
+ env.pop('PYTHONIOENCODING', None)
 p = subprocess.Popen(args,
 stdout=subprocess.PIPE,
 stderr=subprocess.STDOUT,
@@ -709,14 +711,31 @@
 'stderr: backslashreplace\n')
 
 # replace the default error handler
- out = self.c_locale_get_error_handler(encoding=':strict')
+ out = self.c_locale_get_error_handler(encoding=':ignore')
+ self.assertEqual(out,
+ 'stdin: ignore\n'
+ 'stdout: ignore\n'
+ 'stderr: backslashreplace\n')
+
+ # force the encoding
+ out = self.c_locale_get_error_handler(encoding='iso8859-1')
+ self.assertEqual(out,
+ 'stdin: strict\n'
+ 'stdout: strict\n'
+ 'stderr: backslashreplace\n')
+ out = self.c_locale_get_error_handler(encoding='iso8859-1:')
 self.assertEqual(out,
 'stdin: strict\n'
 'stdout: strict\n'
 'stderr: backslashreplace\n')
 
- # force the encoding
- out = self.c_locale_get_error_handler(encoding='iso8859-1')
+ # have no any effect
+ out = self.c_locale_get_error_handler(encoding=':')
+ self.assertEqual(out,
+ 'stdin: surrogateescape\n'
+ 'stdout: surrogateescape\n'
+ 'stderr: backslashreplace\n')
+ out = self.c_locale_get_error_handler(encoding='')
 self.assertEqual(out,
 'stdin: surrogateescape\n'
 'stdout: surrogateescape\n'
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
 Core and Builtins
 -----------------
 
+- Issue #25339: PYTHONIOENCODING now has priority over locale in setting the
+ error handler for stdin and stdout.
+
 - Issue #26494: Fixed crash on iterating exhausting iterators.
 Affected classes are generic sequence iterators, iterators of str, bytes,
 bytearray, list, tuple, set, frozenset, dict, OrderedDict, corresponding
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -1166,15 +1166,6 @@
 encoding = _Py_StandardStreamEncoding;
 errors = _Py_StandardStreamErrors;
 if (!encoding || !errors) {
- if (!errors) {
- /* When the LC_CTYPE locale is the POSIX locale ("C locale"),
- stdin and stdout use the surrogateescape error handler by
- default, instead of the strict error handler. */
- char *loc = setlocale(LC_CTYPE, NULL);
- if (loc != NULL && strcmp(loc, "C") == 0)
- errors = "surrogateescape";
- }
-
 pythonioencoding = Py_GETENV("PYTHONIOENCODING");
 if (pythonioencoding) {
 char *err;
@@ -1187,7 +1178,7 @@
 if (err) {
 *err = '0円';
 err++;
- if (*err && !_Py_StandardStreamErrors) {
+ if (*err && !errors) {
 errors = err;
 }
 }
@@ -1195,6 +1186,14 @@
 encoding = pythonioencoding;
 }
 }
+ if (!errors && !(pythonioencoding && *pythonioencoding)) {
+ /* When the LC_CTYPE locale is the POSIX locale ("C locale"),
+ stdin and stdout use the surrogateescape error handler by
+ default, instead of the strict error handler. */
+ char *loc = setlocale(LC_CTYPE, NULL);
+ if (loc != NULL && strcmp(loc, "C") == 0)
+ errors = "surrogateescape";
+ }
 }
 
 /* Set sys.stdin */
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /