Added Jim Fulton's PyImport_Import(), which calls whatever

__import__() hook is currently installed.
This commit is contained in:
Guido van Rossum 1997-08-14 20:11:26 +00:00
parent 6d8841c079
commit d47a0a86b4
1 changed files with 78 additions and 0 deletions

View File

@ -858,6 +858,84 @@ PyImport_ReloadModule(m)
}
/* Higher-level import emulator which emulates the "import" statement
more accurately -- it invokes the __import__() function from the
builtins of the current globals. This means that the import is
done using whatever import hooks are installed in the current
environment, e.g. by "ni" or "rexec". */
PyObject *
PyImport_Import(module_name)
PyObject *module_name;
{
static PyObject *silly_list = NULL;
static PyObject *builtins_str = NULL;
static PyObject *import_str = NULL;
static PyObject *standard_builtins = NULL;
PyObject *globals = NULL;
PyObject *import = NULL;
PyObject *builtins = NULL;
PyObject *r = NULL;
/* Initialize constant string objects */
if (silly_list == NULL) {
import_str = PyString_InternFromString("__import__");
if (import_str == NULL)
return NULL;
builtins_str = PyString_InternFromString("__builtins__");
if (builtins_str == NULL)
return NULL;
silly_list = Py_BuildValue("[s]", "__doc__");
if (silly_list == NULL)
return NULL;
}
/* Get the builtins from current globals */
globals = PyEval_GetGlobals();
if(globals != NULL) {
builtins = PyObject_GetItem(globals, builtins_str);
if (builtins == NULL)
goto err;
}
else {
/* No globals -- use standard builtins, and fake globals */
PyErr_Clear();
if (standard_builtins == NULL) {
standard_builtins =
PyImport_ImportModule("__builtin__");
if (standard_builtins == NULL)
return NULL;
}
builtins = standard_builtins;
Py_INCREF(builtins);
globals = Py_BuildValue("{OO}", builtins_str, builtins);
if (globals == NULL)
goto err;
}
/* Get the __import__ function from the builtins */
if (PyDict_Check(builtins))
import=PyObject_GetItem(builtins, import_str);
else
import=PyObject_GetAttr(builtins, import_str);
if (import == NULL)
goto err;
/* Call the _import__ function with the proper argument list */
r = PyObject_CallFunction(import, "OOOO",
module_name, globals, globals, silly_list);
err:
Py_XDECREF(globals);
Py_XDECREF(builtins);
Py_XDECREF(import);
return r;
}
/* Module 'imp' provides Python access to the primitives used for
importing modules.
*/