From aebbaeb962b306d6143f77762dd53fae176bcf0e Mon Sep 17 00:00:00 2001 From: Philip Jenvey Date: Tue, 6 Apr 2010 23:24:45 +0000 Subject: #7301: add the environment variable $PYTHONWARNINGS to supplement the -W command line option patch from Brian Curtin --- Doc/using/cmdline.rst | 8 ++++++++ Lib/test/test_warnings.py | 39 +++++++++++++++++++++++++++++++++++++++ Misc/NEWS | 2 ++ Modules/main.c | 11 +++++++++++ 4 files changed, 60 insertions(+) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index cd5b8b5..7ccf8f0 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -352,6 +352,8 @@ Miscellaneous options :pep:`230` -- Warning framework + :envvar:`PYTHONWARNINGS` + .. cmdoption:: -x @@ -547,6 +549,12 @@ These environment variables influence Python's behavior. 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 ~~~~~~~~~~~~~~~~~~~~ diff --git a/Lib/test/test_warnings.py b/Lib/test/test_warnings.py index a0a65b4..e8df368 100644 --- a/Lib/test/test_warnings.py +++ b/Lib/test/test_warnings.py @@ -4,6 +4,7 @@ import os import StringIO import sys import unittest +import subprocess from test import test_support import warning_tests @@ -674,6 +675,42 @@ class PyCatchWarningTests(CatchWarningTests): 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() @@ -683,6 +720,8 @@ def test_main(): _WarningsTests, CWarningsDisplayTests, PyWarningsDisplayTests, CCatchWarningTests, PyCatchWarningTests, + CEnvironmentVariableTests, + PyEnvironmentVariableTests ) diff --git a/Misc/NEWS b/Misc/NEWS index 7b82372..1334cdc 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,8 @@ What's New in Python 2.7 beta 1? Core and Builtins ----------------- +- Issue #7301: Add environment variable $PYTHONWARNINGS. + - Issue #8329: Don't return the same lists from select.select when no fds are changed. diff --git a/Modules/main.c b/Modules/main.c index 7f98ed0..0ba01f7 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -83,6 +83,7 @@ static char *usage_3 = "\ 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 @@ Py_Main(int argc, char **argv) (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) { -- cgit v0.12