diff options
author | Guido van Rossum <guido@python.org> | 1997-09-06 19:41:09 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-09-06 19:41:09 (GMT) |
commit | 222ef56bbf30cd1435dffb61f3c41b3a93cda9d3 (patch) | |
tree | a83449b89addaf950faf4d6c3816bdb71dbb1141 /Python/import.c | |
parent | 17fc85f2f581cd5fcbd139aeb1b5078e0e509cc1 (diff) | |
download | cpython-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.c | 26 |
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); |