这是预期的行为。
参见http://docs.python.org/2/library/imp.html
imp.load_source(name,pathname [,file])
加载并初始化实现为Python源文件的模块,然后返回其模块对象。如果模块已经初始化,它将再次被初始化。name参数用于创建或 访问 模块对象。
由于您的第二个模块与第一个模块具有相同的名称,因此它不会替代第一个模块,但是会合并到第一个模块中。
源代码给了我们相同的答案。
imp是内置模块,在import.c中定义。
让我们看一下
load_source
static PyObject *load_source_module(char *name, char *pathname, FILE *fp){ ...... m = Pyimport_ExecCodeModuleEx(name, (PyObject *)co, pathname); Py_DECREF(co); return m;}它只是的包装
Pyimport_ExecCodeModuleEx。
PyObject *Pyimport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname){ PyObject *modules = Pyimport_GetModuleDict(); PyObject *m, *d, *v; m = Pyimport_AddModule(name); ...... d = PyModule_GetDict(m); ...... v = Pyeval_evalCode((PyCodeObject *)co, d, d); ......}现在,我们只需要关注
Pyimport_AddModule。Python使用它来获取模块对象。您解析的源文件将放入此模块对象。
PyObject *Pyimport_AddModule(const char *name){ PyObject *modules = Pyimport_GetModuleDict(); PyObject *m; if ((m = PyDict_GetItemString(modules, name)) != NULL && PyModule_Check(m)) return m; m = PyModule_New(name); if (m == NULL) return NULL; if (PyDict_SetItemString(modules, name, m) != 0) { Py_DECREF(m); return NULL; } Py_DECREF(m); return m;}最后,我们找到了答案。给定一个
name,如果某个模块已经具有
name,则
name insys.modules,Python将不会创建新模块,而是会重用该模块。



