summaryrefslogtreecommitdiffstats
path: root/Python/import.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1997-09-06 19:41:09 (GMT)
committerGuido van Rossum <guido@python.org>1997-09-06 19:41:09 (GMT)
commit222ef56bbf30cd1435dffb61f3c41b3a93cda9d3 (patch)
treea83449b89addaf950faf4d6c3816bdb71dbb1141 /Python/import.c
parent17fc85f2f581cd5fcbd139aeb1b5078e0e509cc1 (diff)
downloadcpython-222ef56bbf30cd1435dffb61f3c41b3a93cda9d3.zip
cpython-222ef56bbf30cd1435dffb61f3c41b3a93cda9d3.tar.gz
cpython-222ef56bbf30cd1435dffb61f3c41b3a93cda9d3.tar.bz2
Fix reload() for package submodules.
Diffstat (limited to 'Python/import.c')
-rw-r--r--Python/import.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/Python/import.c b/Python/import.c
index a581c4f..d62815e 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1306,7 +1306,8 @@ PyImport_ReloadModule(m)
PyObject *m;
{
PyObject *modules = PyImport_GetModuleDict();
- char *name;
+ PyObject *path = NULL;
+ char *name, *subname;
char buf[MAXPATHLEN+1];
struct filedescr *fdp;
FILE *fp = NULL;
@@ -1325,8 +1326,29 @@ PyImport_ReloadModule(m)
name);
return NULL;
}
+ subname = strrchr(name, '.');
+ if (subname == NULL)
+ subname = name;
+ else {
+ PyObject *parentname, *parent;
+ parentname = PyString_FromStringAndSize(name, (subname-name));
+ if (parentname == NULL)
+ return NULL;
+ parent = PyDict_GetItem(modules, parentname);
+ if (parent == NULL) {
+ PyErr_Format(PyExc_ImportError,
+ "reload(): parent %.200s not in sys.modules",
+ name);
+ return NULL;
+ }
+ subname++;
+ path = PyObject_GetAttrString(parent, "__path__");
+ if (path == NULL)
+ PyErr_Clear();
+ }
buf[0] = '\0';
- fdp = find_module(name, (PyObject *)NULL, buf, MAXPATHLEN+1, &fp);
+ fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
+ Py_XDECREF(path);
if (fdp == NULL)
return NULL;
m = load_module(name, fp, buf, fdp->type);