]> granicus.if.org Git - python/commitdiff
Issue #10372: Import the warnings module only after the IO library is
authorAntoine Pitrou <solipsis@pitrou.net>
Wed, 10 Nov 2010 13:55:25 +0000 (13:55 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Wed, 10 Nov 2010 13:55:25 +0000 (13:55 +0000)
initialized, so as to avoid bootstrap issues with the '-W' option.

Lib/test/test_warnings.py
Misc/NEWS
Python/pythonrun.c

index 52b9dbedd77061ba3edb82174cd3c28c4fd942b4..111ff792f502c83f46e523947955ec2828de135c 100644 (file)
@@ -6,6 +6,7 @@ import sys
 import unittest
 import subprocess
 from test import support
+from test.script_helper import assert_python_ok
 
 from test import warning_tests
 
@@ -393,6 +394,22 @@ class WCmdLineTests(unittest.TestCase):
             self.module._setoption('error::Warning::0')
             self.assertRaises(UserWarning, self.module.warn, 'convert to error')
 
+    def test_improper_option(self):
+        # Same as above, but check that the message is printed out when
+        # the interpreter is executed. This also checks that options are
+        # actually parsed at all.
+        rc, out, err = assert_python_ok("-Wxxx", "-c", "pass")
+        self.assertIn(b"Invalid -W option ignored: invalid action: 'xxx'", err)
+
+    def test_warnings_bootstrap(self):
+        # Check that the warnings module does get loaded when -W<some option>
+        # is used (see issue #10372 for an example of silent bootstrap failure).
+        rc, out, err = assert_python_ok("-Wi", "-c",
+            "import sys; sys.modules['warnings'].warn('foo', RuntimeWarning)")
+        # '-Wi' was observed
+        self.assertFalse(out.strip())
+        self.assertNotIn(b'RuntimeWarning', err)
+
 class CWCmdLineTests(BaseTest, WCmdLineTests):
     module = c_warnings
 
index 5cd664755a8c5272d4fed7ad062d6ea76125ad93..7dc9b6c5ad7b246b33c6e02de33b89e2788320e8 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.2 Alpha 4?
 Core and Builtins
 -----------------
 
+- Issue #10372: Import the warnings module only after the IO library is
+  initialized, so as to avoid bootstrap issues with the '-W' option.
+
 - Issue #10293: Remove obsolete field in the PyMemoryView structure,
   unused undocumented value PyBUF_SHADOW, and strangely-looking code in
   PyMemoryView_GetContiguous.
index 8b1e61a1c93e48327e5b86b2bb48ec5700a5a2e8..784558c11976a96d910f4073aeba03604821551d 100644 (file)
@@ -299,19 +299,21 @@ Py_InitializeEx(int install_sigs)
     if (install_sigs)
         initsigs(); /* Signal handling stuff, including initintr() */
 
+    initmain(); /* Module __main__ */
+    if (initstdio() < 0)
+        Py_FatalError(
+            "Py_Initialize: can't initialize sys standard streams");
+
     /* Initialize warnings. */
     if (PySys_HasWarnOptions()) {
         PyObject *warnings_module = PyImport_ImportModule("warnings");
-        if (!warnings_module)
-            PyErr_Clear();
+        if (warnings_module == NULL) {
+            fprintf(stderr, "'import warnings' failed; traceback:\n");
+            PyErr_Print();
+        }
         Py_XDECREF(warnings_module);
     }
 
-    initmain(); /* Module __main__ */
-    if (initstdio() < 0)
-        Py_FatalError(
-            "Py_Initialize: can't initialize sys standard streams");
-
     if (!Py_NoSiteFlag)
         initsite(); /* Module site */
 }