Index: Lib/test/script_helper.py =================================================================== --- Lib/test/script_helper.py (révision 80170) +++ Lib/test/script_helper.py (copie de travail) @@ -19,11 +19,12 @@ return subprocess.call(cmd_line, stdout=devnull, stderr=subprocess.STDOUT) -def spawn_python(*args): +def spawn_python(*args, **kwargs): cmd_line = [sys.executable, '-E'] cmd_line.extend(args) return subprocess.Popen(cmd_line, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + **kwargs) def kill_python(p): p.stdin.close() @@ -35,11 +36,11 @@ subprocess._cleanup() return data -def run_python(*args): +def run_python(*args, **kwargs): if __debug__: - p = spawn_python(*args) + p = spawn_python(*args, **kwargs) else: - p = spawn_python('-O', *args) + p = spawn_python('-O', *args, **kwargs) stdout_data = kill_python(p) return p.wait(), stdout_data Index: Lib/test/test_fileio.py =================================================================== --- Lib/test/test_fileio.py (révision 80170) +++ Lib/test/test_fileio.py (copie de travail) @@ -12,6 +12,7 @@ from test.test_support import TESTFN, check_warnings, run_unittest, make_bad_fd from test.test_support import py3k_bytes as bytes +from test.script_helper import run_python from _io import FileIO as _FileIO @@ -397,6 +398,24 @@ self.assertRaises(ValueError, _FileIO, "/some/invalid/name", "rt") self.assertEqual(w.warnings, []) + def test_surrogates(self): + # Issue #8438: try to open a filename containing surrogates. + # It should either fail because the file doesn't exist or the filename + # can't be represented using the filesystem encoding, but not because + # of a LookupError for the error handler "surrogateescape". + filename = u'\udc80.txt' + try: + _FileIO(filename) + except (UnicodeEncodeError, IOError): + pass + # Spawn a separate Python process with a different "file system + # default encoding", to exercise this further. + env = dict(os.environ) + env[b'LC_CTYPE'] = b'C' + _, out = run_python('-c', 'import _io; _io.FileIO(%r)' % filename, env=env) + if ('UnicodeEncodeError' not in out and + 'IOError: [Errno 2] No such file or directory' not in out): + self.fail('Bad output: %r' % out) def test_main(): # Historically, these tests have been sloppy about removing TESTFN. Index: Modules/_io/fileio.c =================================================================== --- Modules/_io/fileio.c (révision 80170) +++ Modules/_io/fileio.c (copie de travail) @@ -248,7 +248,7 @@ return -1; stringobj = PyUnicode_AsEncodedString( - u, Py_FileSystemDefaultEncoding, "surrogateescape"); + u, Py_FileSystemDefaultEncoding, NULL); Py_DECREF(u); if (stringobj == NULL) return -1;