Index: Python/errors.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/errors.c,v retrieving revision 2.75 diff -u -r2.75 errors.c --- Python/errors.c 11 Dec 2002 14:04:59 -0000 2.75 +++ Python/errors.c 18 Feb 2003 22:51:43 -0000 @@ -600,18 +600,17 @@ Py_XDECREF(tb); } +extern PyObject *PyModule_WarningsModule; /* Function to issue a warning message; may raise an exception. */ int PyErr_Warn(PyObject *category, char *message) { - PyObject *mod, *dict, *func = NULL; + PyObject *dict, *func = NULL; - mod = PyImport_ImportModule("warnings"); - if (mod != NULL) { - dict = PyModule_GetDict(mod); + if (PyModule_WarningsModule != NULL) { + dict = PyModule_GetDict(PyModule_WarningsModule); func = PyDict_GetItemString(dict, "warn"); - Py_DECREF(mod); } if (func == NULL) { PySys_WriteStderr("warning: %s\n", message); Index: Python/pythonrun.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/pythonrun.c,v retrieving revision 2.177 diff -u -r2.177 pythonrun.c --- Python/pythonrun.c 13 Feb 2003 22:07:59 -0000 2.177 +++ Python/pythonrun.c 18 Feb 2003 22:51:44 -0000 @@ -60,6 +60,11 @@ true divisions (which they will be in 2.3). */ int _Py_QnewFlag = 0; +/* Reference to 'warnings' module, to avoid importing it + on the fly when the import lock may be held. See 683658 +*/ +PyObject *PyModule_WarningsModule = NULL; + static int initialized = 0; /* API to access the initialized flag -- useful for esoteric use */ @@ -169,6 +174,8 @@ _PyImportHooks_Init(); + PyModule_WarningsModule = PyImport_ImportModule("warnings"); + initsigs(); /* Signal handling stuff, including initintr() */ initmain(); /* Module __main__ */ @@ -224,6 +231,10 @@ /* Cleanup Codec registry */ _PyCodecRegistry_Fini(); + + /* drop module references we saved */ + Py_XDECREF(PyModule_WarningsModule); + PyModule_WarningsModule = NULL; /* Destroy all modules */ PyImport_Cleanup(); Index: Lib/warnings.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/warnings.py,v retrieving revision 1.18 diff -u -r1.18 warnings.py --- Lib/warnings.py 14 Oct 2002 21:06:02 -0000 1.18 +++ Lib/warnings.py 18 Feb 2003 22:51:44 -0000 @@ -1,6 +1,10 @@ """Python part of the warnings subsystem.""" +# Note: function level imports should *not* be used +# in this module as it may cause import lock deadlock. +# See bug 683658. import sys, re, types +import linecache __all__ = ["warn", "showwarning", "formatwarning", "filterwarnings", "resetwarnings"] @@ -114,7 +118,6 @@ def formatwarning(message, category, filename, lineno): """Function to format a warning the standard way.""" - import linecache s = "%s:%s: %s: %s\n" % (filename, lineno, category.__name__, message) line = linecache.getline(filename, lineno).strip() if line: