mirror of https://github.com/python/cpython.git
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Use it for the builtin __import__ function.
This commit is contained in:
parent
98dbba5d20
commit
fe93faf98c
|
@ -57,7 +57,7 @@ Importing Modules
|
||||||
:c:func:`PyImport_ImportModule`.
|
:c:func:`PyImport_ImportModule`.
|
||||||
|
|
||||||
|
|
||||||
.. c:function:: PyObject* PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
|
.. c:function:: PyObject* PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
|
||||||
|
|
||||||
Import a module. This is best described by referring to the built-in Python
|
Import a module. This is best described by referring to the built-in Python
|
||||||
function :func:`__import__`, as the standard :func:`__import__` function calls
|
function :func:`__import__`, as the standard :func:`__import__` function calls
|
||||||
|
@ -68,6 +68,13 @@ Importing Modules
|
||||||
the return value when a submodule of a package was requested is normally the
|
the return value when a submodule of a package was requested is normally the
|
||||||
top-level package, unless a non-empty *fromlist* was given.
|
top-level package, unless a non-empty *fromlist* was given.
|
||||||
|
|
||||||
|
.. versionadded:: 3.3
|
||||||
|
|
||||||
|
|
||||||
|
.. c:function:: PyObject* PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
|
||||||
|
|
||||||
|
Similar to :c:func:`PyImport_ImportModuleLevelObject`, but the name is an
|
||||||
|
UTF-8 encoded string instead of a Unicode object.
|
||||||
|
|
||||||
.. c:function:: PyObject* PyImport_Import(PyObject *name)
|
.. c:function:: PyObject* PyImport_Import(PyObject *name)
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,13 @@ PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel(
|
||||||
PyObject *fromlist,
|
PyObject *fromlist,
|
||||||
int level
|
int level
|
||||||
);
|
);
|
||||||
|
PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevelObject(
|
||||||
|
PyObject *name,
|
||||||
|
PyObject *globals,
|
||||||
|
PyObject *locals,
|
||||||
|
PyObject *fromlist,
|
||||||
|
int level
|
||||||
|
);
|
||||||
|
|
||||||
#define PyImport_ImportModuleEx(n, g, l, f) \
|
#define PyImport_ImportModuleEx(n, g, l, f) \
|
||||||
PyImport_ImportModuleLevel(n, g, l, f, -1)
|
PyImport_ImportModuleLevel(n, g, l, f, -1)
|
||||||
|
|
|
@ -155,17 +155,14 @@ builtin___import__(PyObject *self, PyObject *args, PyObject *kwds)
|
||||||
{
|
{
|
||||||
static char *kwlist[] = {"name", "globals", "locals", "fromlist",
|
static char *kwlist[] = {"name", "globals", "locals", "fromlist",
|
||||||
"level", 0};
|
"level", 0};
|
||||||
char *name;
|
PyObject *name, *globals = NULL, *locals = NULL, *fromlist = NULL;
|
||||||
PyObject *globals = NULL;
|
|
||||||
PyObject *locals = NULL;
|
|
||||||
PyObject *fromlist = NULL;
|
|
||||||
int level = -1;
|
int level = -1;
|
||||||
|
|
||||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|OOOi:__import__",
|
if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|OOOi:__import__",
|
||||||
kwlist, &name, &globals, &locals, &fromlist, &level))
|
kwlist, &name, &globals, &locals, &fromlist, &level))
|
||||||
return NULL;
|
return NULL;
|
||||||
return PyImport_ImportModuleLevel(name, globals, locals,
|
return PyImport_ImportModuleLevelObject(name, globals, locals,
|
||||||
fromlist, level);
|
fromlist, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(import_doc,
|
PyDoc_STRVAR(import_doc,
|
||||||
|
|
|
@ -2753,25 +2753,37 @@ import_module_level(PyObject *name, PyObject *globals, PyObject *locals,
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
|
PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
|
||||||
PyObject *fromlist, int level)
|
PyObject *locals, PyObject *fromlist,
|
||||||
|
int level)
|
||||||
{
|
{
|
||||||
PyObject *nameobj, *result;
|
PyObject *mod;
|
||||||
nameobj = PyUnicode_FromString(name);
|
|
||||||
if (nameobj == NULL)
|
|
||||||
return NULL;
|
|
||||||
_PyImport_AcquireLock();
|
_PyImport_AcquireLock();
|
||||||
result = import_module_level(nameobj, globals, locals, fromlist, level);
|
mod = import_module_level(name, globals, locals, fromlist, level);
|
||||||
Py_DECREF(nameobj);
|
|
||||||
if (_PyImport_ReleaseLock() < 0) {
|
if (_PyImport_ReleaseLock() < 0) {
|
||||||
Py_XDECREF(result);
|
Py_XDECREF(mod);
|
||||||
PyErr_SetString(PyExc_RuntimeError,
|
PyErr_SetString(PyExc_RuntimeError,
|
||||||
"not holding the import lock");
|
"not holding the import lock");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return result;
|
return mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject *
|
||||||
|
PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
|
||||||
|
PyObject *fromlist, int level)
|
||||||
|
{
|
||||||
|
PyObject *nameobj, *mod;
|
||||||
|
nameobj = PyUnicode_FromString(name);
|
||||||
|
if (nameobj == NULL)
|
||||||
|
return NULL;
|
||||||
|
mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
|
||||||
|
fromlist, level);
|
||||||
|
Py_DECREF(nameobj);
|
||||||
|
return mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return the package that an import is being performed in. If globals comes
|
/* Return the package that an import is being performed in. If globals comes
|
||||||
from the module foo.bar.bat (not itself a package), this returns the
|
from the module foo.bar.bat (not itself a package), this returns the
|
||||||
sys.modules entry for foo.bar. If globals is from a package's __init__.py,
|
sys.modules entry for foo.bar. If globals is from a package's __init__.py,
|
||||||
|
|
Loading…
Reference in New Issue