SF Patch #441791, with changes: when "import foo.bar" fails with an
exception in the execution of bar, ensure that foo.bar exists.
(Previously, while sys.modules['foo.bar'] would exist, foo.bar would
only be created upon successful execution of bar.  This is
inconvenient; some would say wrong. :-)
diff --git a/Python/import.c b/Python/import.c
index 7443724..456a5be 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1789,7 +1789,7 @@
 import_submodule(PyObject *mod, char *subname, char *fullname)
 {
 	PyObject *modules = PyImport_GetModuleDict();
-	PyObject *m;
+	PyObject *m, *res = NULL;
 
 	/* Require:
 	   if mod == None: subname == fullname
@@ -1829,9 +1829,21 @@
 		m = load_module(fullname, fp, buf, fdp->type);
 		if (fp)
 			fclose(fp);
-		if (m != NULL && mod != Py_None) {
-			if (PyObject_SetAttrString(mod, subname, m) < 0) {
-				Py_DECREF(m);
+		if (mod != Py_None) {
+			/* Irrespective of the success of this load, make a
+			   reference to it in the parent package module.
+			   A copy gets saved in the modules dictionary
+			   under the full name, so get a reference from
+			   there, if need be.  (The exception is when
+			   the load failed with a SyntaxError -- then
+			   there's no trace in sys.modules.  In that case,
+			   of course, do nothing extra.) */
+			res = m;
+			if (res == NULL)
+				res = PyDict_GetItemString(modules, fullname);
+			if (res != NULL &&
+			    PyObject_SetAttrString(mod, subname, res) < 0) {
+				Py_XDECREF(m);
 				m = NULL;
 			}
 		}