Issue #13959: Re-implement imp.load_module() in imp.py.
This commit is contained in:
parent
7c3e150d06
commit
01a76171a0
29
Lib/imp.py
29
Lib/imp.py
|
@ -14,10 +14,37 @@ from _imp import (lock_held, acquire_lock, release_lock, reload,
|
||||||
from _imp import (get_magic, get_tag, get_suffixes, cache_from_source,
|
from _imp import (get_magic, get_tag, get_suffixes, cache_from_source,
|
||||||
source_from_cache)
|
source_from_cache)
|
||||||
# Should be re-implemented here (and mostly deprecated)
|
# Should be re-implemented here (and mostly deprecated)
|
||||||
from _imp import (find_module, load_module, load_compiled,
|
from _imp import (find_module, load_compiled,
|
||||||
load_package, load_source, NullImporter,
|
load_package, load_source, NullImporter,
|
||||||
SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION,
|
SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION,
|
||||||
PY_RESOURCE, PKG_DIRECTORY, C_BUILTIN, PY_FROZEN,
|
PY_RESOURCE, PKG_DIRECTORY, C_BUILTIN, PY_FROZEN,
|
||||||
PY_CODERESOURCE, IMP_HOOK)
|
PY_CODERESOURCE, IMP_HOOK)
|
||||||
|
|
||||||
from importlib._bootstrap import _new_module as new_module
|
from importlib._bootstrap import _new_module as new_module
|
||||||
|
|
||||||
|
|
||||||
|
def load_module(name, file, filename, details):
|
||||||
|
"""Load a module, given information returned by find_module().
|
||||||
|
|
||||||
|
The module name must include the full package name, if any.
|
||||||
|
|
||||||
|
"""
|
||||||
|
suffix, mode, type_ = details
|
||||||
|
if mode and (not mode.startswith(('r', 'U'))) or '+' in mode:
|
||||||
|
raise ValueError('invalid file open mode {!r}'.format(mode))
|
||||||
|
elif file is None and type_ in {PY_SOURCE, PY_COMPILED}:
|
||||||
|
msg = 'file object required for import (type code {})'.format(type_)
|
||||||
|
raise ValueError(msg)
|
||||||
|
elif type_ == PY_SOURCE:
|
||||||
|
return load_source(name, filename, file)
|
||||||
|
elif type_ == PY_COMPILED:
|
||||||
|
return load_compiled(name, filename, file)
|
||||||
|
elif type_ == PKG_DIRECTORY:
|
||||||
|
return load_package(name, filename)
|
||||||
|
elif type_ == C_BUILTIN:
|
||||||
|
return init_builtin(name)
|
||||||
|
elif type_ == PY_FROZEN:
|
||||||
|
return init_frozen(name)
|
||||||
|
else:
|
||||||
|
msg = "Don't know how to import {} (type code {}".format(name, type_)
|
||||||
|
raise ImportError(msg, name=name)
|
||||||
|
|
|
@ -3600,53 +3600,6 @@ imp_load_source(PyObject *self, PyObject *args)
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
imp_load_module(PyObject *self, PyObject *args)
|
|
||||||
{
|
|
||||||
PyObject *name, *fob, *pathname, *pathname_obj, *ret;
|
|
||||||
char *suffix; /* Unused */
|
|
||||||
char *mode;
|
|
||||||
int type;
|
|
||||||
FILE *fp;
|
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "UOO(ssi):load_module",
|
|
||||||
&name, &fob, &pathname_obj, &suffix, &mode, &type))
|
|
||||||
return NULL;
|
|
||||||
if (pathname_obj != Py_None) {
|
|
||||||
if (!PyUnicode_FSDecoder(pathname_obj, &pathname))
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pathname = NULL;
|
|
||||||
|
|
||||||
if (*mode) {
|
|
||||||
/* Mode must start with 'r' or 'U' and must not contain '+'.
|
|
||||||
Implicit in this test is the assumption that the mode
|
|
||||||
may contain other modifiers like 'b' or 't'. */
|
|
||||||
|
|
||||||
if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
|
|
||||||
PyErr_Format(PyExc_ValueError,
|
|
||||||
"invalid file open mode %.200s", mode);
|
|
||||||
Py_XDECREF(pathname);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (fob == Py_None)
|
|
||||||
fp = NULL;
|
|
||||||
else {
|
|
||||||
fp = get_file(NULL, fob, mode);
|
|
||||||
if (fp == NULL) {
|
|
||||||
Py_XDECREF(pathname);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ret = load_module(name, fp, pathname, type, NULL);
|
|
||||||
Py_XDECREF(pathname);
|
|
||||||
if (fp)
|
|
||||||
fclose(fp);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
imp_load_package(PyObject *self, PyObject *args)
|
imp_load_package(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
|
@ -3757,11 +3710,6 @@ built-in, frozen or special module and continue search in sys.path.\n\
|
||||||
The module name cannot contain '.'; to search for a submodule of a\n\
|
The module name cannot contain '.'; to search for a submodule of a\n\
|
||||||
package, pass the submodule name and the package's __path__.");
|
package, pass the submodule name and the package's __path__.");
|
||||||
|
|
||||||
PyDoc_STRVAR(doc_load_module,
|
|
||||||
"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
|
|
||||||
Load a module, given information returned by find_module().\n\
|
|
||||||
The module name must include the full package name, if any.");
|
|
||||||
|
|
||||||
PyDoc_STRVAR(doc_get_magic,
|
PyDoc_STRVAR(doc_get_magic,
|
||||||
"get_magic() -> string\n\
|
"get_magic() -> string\n\
|
||||||
Return the magic number for .pyc or .pyo files.");
|
Return the magic number for .pyc or .pyo files.");
|
||||||
|
@ -3797,7 +3745,6 @@ static PyMethodDef imp_methods[] = {
|
||||||
{"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
|
{"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
|
||||||
{"get_tag", imp_get_tag, METH_NOARGS, doc_get_tag},
|
{"get_tag", imp_get_tag, METH_NOARGS, doc_get_tag},
|
||||||
{"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
|
{"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
|
||||||
{"load_module", imp_load_module, METH_VARARGS, doc_load_module},
|
|
||||||
{"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
|
{"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
|
||||||
{"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
|
{"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
|
||||||
{"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
|
{"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
|
||||||
|
|
Loading…
Reference in New Issue