Index: Doc/using/cmdline.rst =================================================================== --- Doc/using/cmdline.rst (revision 77505) +++ Doc/using/cmdline.rst (working copy) @@ -353,6 +353,8 @@ :mod:`warnings` -- the warnings module :pep:`230` -- Warning framework + + :envvar:`PYTHONWARNINGS` .. cmdoption:: -x @@ -528,8 +530,13 @@ If this environment variable is set, ``sys.argv[0]`` will be set to its value instead of the value got through the C runtime. Only works on Mac OS X. + +.. envvar:: PYTHONWARNINGS + This is the equivalent to the :option:`-W` option. If set to a comma + separated string, it is equivalent to specifying :option:`-W` multiple times. + Debug-mode variables ~~~~~~~~~~~~~~~~~~~~ Index: Lib/test/test_warnings.py =================================================================== --- Lib/test/test_warnings.py (revision 77505) +++ Lib/test/test_warnings.py (working copy) @@ -4,6 +4,7 @@ import StringIO import sys import unittest +import subprocess from test import test_support import warning_tests @@ -655,6 +656,42 @@ module = py_warnings +class EnvironmentVariableTests(BaseTest): + + def test_single_warning(self): + newenv = os.environ.copy() + newenv["PYTHONWARNINGS"] = "ignore::DeprecationWarning" + p = subprocess.Popen(sys.executable + + ' -c "import sys; sys.stdout.write(str(sys.warnoptions))"', + stdout=subprocess.PIPE, env=newenv) + self.assertEqual(p.stdout.read(), "['ignore::DeprecationWarning']") + + def test_comma_separated_warnings(self): + newenv = os.environ.copy() + newenv["PYTHONWARNINGS"] = ("ignore::DeprecationWarning," + "ignore::UnicodeWarning") + p = subprocess.Popen(sys.executable + + ' -c "import sys; sys.stdout.write(str(sys.warnoptions))"', + stdout=subprocess.PIPE, env=newenv) + self.assertEqual(p.stdout.read(), + "['ignore::DeprecationWarning', 'ignore::UnicodeWarning']") + + def test_envvar_and_command_line(self): + newenv = os.environ.copy() + newenv["PYTHONWARNINGS"] = "ignore::DeprecationWarning" + p = subprocess.Popen(sys.executable + (" -W ignore::UnicodeWarning" + ' -c "import sys; sys.stdout.write(str(sys.warnoptions))"'), + stdout=subprocess.PIPE, env=newenv) + self.assertEqual(p.stdout.read(), + "['ignore::UnicodeWarning', 'ignore::DeprecationWarning']") + +class CEnvironmentVariableTests(EnvironmentVariableTests): + module = c_warnings + +class PyEnvironmentVariableTests(EnvironmentVariableTests): + module = py_warnings + + def test_main(): py_warnings.onceregistry.clear() c_warnings.onceregistry.clear() @@ -664,6 +701,8 @@ _WarningsTests, CWarningsDisplayTests, PyWarningsDisplayTests, CCatchWarningTests, PyCatchWarningTests, + CEnvironmentVariableTests, + PyEnvironmentVariableTests ) Index: Modules/main.c =================================================================== --- Modules/main.c (revision 77505) +++ Modules/main.c (working copy) @@ -83,6 +83,7 @@ can be supplied multiple times to increase verbosity\n\ -V : print the Python version number and exit (also --version)\n\ -W arg : warning control; arg is action:message:category:module:lineno\n\ + also PYTHONWARNINGS=arg\n\ -x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\ "; static char *usage_4 = "\ @@ -420,6 +421,16 @@ (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0') Py_NoUserSiteDirectory = 1; + if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') + { + char* warning = strtok(p, ","); + while (warning != NULL) + { + PySys_AddWarnOption(warning); + warning = strtok(NULL, ","); + } + } + if (command == NULL && module == NULL && _PyOS_optind < argc && strcmp(argv[_PyOS_optind], "-") != 0) {