Fix bug 683658 - PyErr_Warn may cause import deadlock.
diff --git a/Python/errors.c b/Python/errors.c
index e509606..d08c1af 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -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);
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 1faab50..2845d24 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -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__ */
@@ -225,6 +232,10 @@
 	/* Cleanup Codec registry */
 	_PyCodecRegistry_Fini();
 
+	/* drop module references we saved */
+	Py_XDECREF(PyModule_WarningsModule);
+	PyModule_WarningsModule = NULL;
+
 	/* Destroy all modules */
 	PyImport_Cleanup();