Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d47a0a8

Browse files
committed
Added Jim Fulton's PyImport_Import(), which calls whatever
__import__() hook is currently installed.
1 parent 6d8841c commit d47a0a8

1 file changed

Lines changed: 78 additions & 0 deletions

File tree

Python/import.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,84 @@ PyImport_ReloadModule(m)
858858
}
859859

860860

861+
/* Higher-level import emulator which emulates the "import" statement
862+
more accurately -- it invokes the __import__() function from the
863+
builtins of the current globals. This means that the import is
864+
done using whatever import hooks are installed in the current
865+
environment, e.g. by "ni" or "rexec". */
866+
867+
PyObject *
868+
PyImport_Import(module_name)
869+
PyObject *module_name;
870+
{
871+
static PyObject *silly_list = NULL;
872+
static PyObject *builtins_str = NULL;
873+
static PyObject *import_str = NULL;
874+
static PyObject *standard_builtins = NULL;
875+
PyObject *globals = NULL;
876+
PyObject *import = NULL;
877+
PyObject *builtins = NULL;
878+
PyObject *r = NULL;
879+
880+
/* Initialize constant string objects */
881+
if (silly_list == NULL) {
882+
import_str = PyString_InternFromString("__import__");
883+
if (import_str == NULL)
884+
return NULL;
885+
builtins_str = PyString_InternFromString("__builtins__");
886+
if (builtins_str == NULL)
887+
return NULL;
888+
silly_list = Py_BuildValue("[s]", "__doc__");
889+
if (silly_list == NULL)
890+
return NULL;
891+
}
892+
893+
/* Get the builtins from current globals */
894+
globals = PyEval_GetGlobals();
895+
if(globals != NULL) {
896+
builtins = PyObject_GetItem(globals, builtins_str);
897+
if (builtins == NULL)
898+
goto err;
899+
}
900+
else {
901+
/* No globals -- use standard builtins, and fake globals */
902+
PyErr_Clear();
903+
904+
if (standard_builtins == NULL) {
905+
standard_builtins =
906+
PyImport_ImportModule("__builtin__");
907+
if (standard_builtins == NULL)
908+
return NULL;
909+
}
910+
911+
builtins = standard_builtins;
912+
Py_INCREF(builtins);
913+
globals = Py_BuildValue("{OO}", builtins_str, builtins);
914+
if (globals == NULL)
915+
goto err;
916+
}
917+
918+
/* Get the __import__ function from the builtins */
919+
if (PyDict_Check(builtins))
920+
import=PyObject_GetItem(builtins, import_str);
921+
else
922+
import=PyObject_GetAttr(builtins, import_str);
923+
if (import == NULL)
924+
goto err;
925+
926+
/* Call the _import__ function with the proper argument list */
927+
r = PyObject_CallFunction(import, "OOOO",
928+
module_name, globals, globals, silly_list);
929+
930+
err:
931+
Py_XDECREF(globals);
932+
Py_XDECREF(builtins);
933+
Py_XDECREF(import);
934+
935+
return r;
936+
}
937+
938+
861939
/* Module 'imp' provides Python access to the primitives used for
862940
importing modules.
863941
*/

0 commit comments

Comments
 (0)