[Python-3000-checkins] r63891 - in python/branches/py3k: Doc/using/cmdline.rst Lib/test/test_sys.py Modules/main.c Python/pythonrun.c

martin.v.loewis python-3000-checkins at python.org
Tue Jun 3 20:57:12 CEST 2008


Author: martin.v.loewis
Date: Mon Jun  2 13:13:03 2008
New Revision: 63891

Log:
Forward-port PYTHONIOENCODING.


Modified:
   python/branches/py3k/Doc/using/cmdline.rst
   python/branches/py3k/Lib/test/test_sys.py
   python/branches/py3k/Modules/main.c
   python/branches/py3k/Python/pythonrun.c

Modified: python/branches/py3k/Doc/using/cmdline.rst
==============================================================================
--- python/branches/py3k/Doc/using/cmdline.rst	(original)
+++ python/branches/py3k/Doc/using/cmdline.rst	Mon Jun  2 13:13:03 2008
@@ -467,6 +467,13 @@
    If set, Python will dump objects and reference counts still alive after
    shutting down the interpreter.
 
+.. envvar:: PYTHONIOENCODING
+
+   Overrides the encoding used for stdin/stdout/stderr, in the syntax
+   encodingname:errorhandler, with the :errors part being optional.
+
+   .. versionadded:: 2.6
+
 
 .. envvar:: PYTHONMALLOCSTATS
 

Modified: python/branches/py3k/Lib/test/test_sys.py
==============================================================================
--- python/branches/py3k/Lib/test/test_sys.py	(original)
+++ python/branches/py3k/Lib/test/test_sys.py	Mon Jun  2 13:13:03 2008
@@ -349,6 +349,26 @@
         #self.assert_(r[0][1] > 100, r[0][1])
         #self.assert_(r[0][2] > 100, r[0][2])
 
+    def test_ioencoding(self):
+        import subprocess,os
+        env = dict(os.environ)
+
+        # Test character: cent sign, encoded as 0x4A (ASCII J) in CP424,
+        # not representable in ASCII.
+
+        env["PYTHONIOENCODING"] = "cp424"
+        p = subprocess.Popen([sys.executable, "-c", 'print(chr(0xa2))'],
+                             stdout = subprocess.PIPE, env=env)
+        out = p.stdout.read()
+        self.assertEqual(out, "\xa2\n".encode("cp424"))
+
+        env["PYTHONIOENCODING"] = "ascii:replace"
+        p = subprocess.Popen([sys.executable, "-c", 'print(chr(0xa2))'],
+                             stdout = subprocess.PIPE, env=env)
+        out = p.stdout.read().strip()
+        self.assertEqual(out, b'?')
+
+
 def test_main():
     test.support.run_unittest(SysModuleTest)
 

Modified: python/branches/py3k/Modules/main.c
==============================================================================
--- python/branches/py3k/Modules/main.c	(original)
+++ python/branches/py3k/Modules/main.c	Mon Jun  2 13:13:03 2008
@@ -96,6 +96,7 @@
 PYTHONHOME   : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
                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\
 ";
 
 #ifndef MS_WINDOWS

Modified: python/branches/py3k/Python/pythonrun.c
==============================================================================
--- python/branches/py3k/Python/pythonrun.c	(original)
+++ python/branches/py3k/Python/pythonrun.c	Mon Jun  2 13:13:03 2008
@@ -701,6 +701,7 @@
 	PyObject *std = NULL;
 	int status = 0, fd;
 	PyObject * encoding_attr;
+	char *encoding, *errors;
 
 	/* Hack to avoid a nasty recursion issue when Python is invoked
 	   in verbose mode: pre-import the Latin-1 and UTF-8 codecs */
@@ -730,6 +731,16 @@
 		goto error;
 	}
 
+	encoding = Py_GETENV("PYTHONIOENCODING");
+	if (encoding) {
+		encoding = strdup(encoding);
+		errors = strchr(encoding, ':');
+		if (errors) {
+			*errors = '\0';
+			errors++;
+		}
+	}
+
 	/* Set sys.stdin */
 	fd = fileno(stdin);
 	/* Under some conditions stdin, stdout and stderr may not be connected
@@ -745,8 +756,8 @@
 #endif
 	}
 	else {
-		if (!(std = PyFile_FromFd(fd, "<stdin>", "r", -1, NULL, NULL,
-					  "\n", 0))) {
+		if (!(std = PyFile_FromFd(fd, "<stdin>", "r", -1, encoding, 
+					  errors, "\n", 0))) {
 			goto error;
 		}
 	} /* if (fd < 0) */
@@ -765,8 +776,8 @@
 #endif
 	}
 	else {
-		if (!(std = PyFile_FromFd(fd, "<stdout>", "w", -1, NULL, NULL,
-					  "\n", 0))) {
+		if (!(std = PyFile_FromFd(fd, "<stdout>", "w", -1, encoding, 
+					  errors, "\n", 0))) {
 			goto error;
 		}
 	} /* if (fd < 0) */
@@ -786,8 +797,8 @@
 #endif
 	}
 	else {
-		if (!(std = PyFile_FromFd(fd, "<stderr>", "w", -1, NULL, NULL,
-					  "\n", 0))) {
+		if (!(std = PyFile_FromFd(fd, "<stderr>", "w", -1, encoding,
+					  errors, "\n", 0))) {
 			goto error;
 		}
 	} /* if (fd < 0) */


More information about the Python-3000-checkins mailing list