mirror of
https://github.com/python/cpython.git
synced 2025-10-22 06:32:43 +00:00
Issue #13959: Re-implement imp.source_from_cache() in Lib/imp.py.
This commit is contained in:
parent
ea59dbff16
commit
a64faf0771
4 changed files with 3199 additions and 3198 deletions
26
Lib/imp.py
26
Lib/imp.py
|
@ -13,7 +13,7 @@ from _imp import (lock_held, acquire_lock, release_lock, reload,
|
||||||
# Could move out of _imp, but not worth the code
|
# Could move out of _imp, but not worth the code
|
||||||
from _imp import get_magic
|
from _imp import get_magic
|
||||||
# Can (probably) move to importlib
|
# Can (probably) move to importlib
|
||||||
from _imp import (get_tag, get_suffixes, source_from_cache)
|
from _imp import (get_tag, get_suffixes)
|
||||||
# Should be re-implemented here (and mostly deprecated)
|
# Should be re-implemented here (and mostly deprecated)
|
||||||
from _imp import (find_module, NullImporter,
|
from _imp import (find_module, NullImporter,
|
||||||
SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION,
|
SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION,
|
||||||
|
@ -27,6 +27,26 @@ from importlib import _bootstrap
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def source_from_cache(path):
|
||||||
|
"""Given the path to a .pyc./.pyo file, return the path to its .py file.
|
||||||
|
|
||||||
|
The .pyc/.pyo file does not need to exist; this simply returns the path to
|
||||||
|
the .py file calculated to correspond to the .pyc/.pyo file. If path does
|
||||||
|
not conform to PEP 3147 format, ValueError will be raised.
|
||||||
|
|
||||||
|
"""
|
||||||
|
head, pycache_filename = os.path.split(path)
|
||||||
|
head, pycache = os.path.split(head)
|
||||||
|
if pycache != _bootstrap.PYCACHE:
|
||||||
|
raise ValueError('{} not bottom-level directory in '
|
||||||
|
'{!r}'.format(_bootstrap.PYCACHE, path))
|
||||||
|
if pycache_filename.count('.') != 2:
|
||||||
|
raise ValueError('expected only 2 dots in '
|
||||||
|
'{!r}'.format(pycache_filename))
|
||||||
|
base_filename = pycache_filename.partition('.')[0]
|
||||||
|
return os.path.join(head, base_filename + _bootstrap.SOURCE_SUFFIXES[0])
|
||||||
|
|
||||||
|
|
||||||
class _HackedGetData:
|
class _HackedGetData:
|
||||||
|
|
||||||
"""Compatibiilty support for 'file' arguments of various load_*()
|
"""Compatibiilty support for 'file' arguments of various load_*()
|
||||||
|
@ -55,6 +75,7 @@ class _LoadSourceCompatibility(_HackedGetData, _bootstrap._SourceFileLoader):
|
||||||
"""Compatibility support for implementing load_source()."""
|
"""Compatibility support for implementing load_source()."""
|
||||||
|
|
||||||
|
|
||||||
|
# XXX deprecate after better API exposed in importlib
|
||||||
def load_source(name, pathname, file=None):
|
def load_source(name, pathname, file=None):
|
||||||
return _LoadSourceCompatibility(name, pathname, file).load_module(name)
|
return _LoadSourceCompatibility(name, pathname, file).load_module(name)
|
||||||
|
|
||||||
|
@ -65,10 +86,12 @@ class _LoadCompiledCompatibility(_HackedGetData,
|
||||||
"""Compatibility support for implementing load_compiled()."""
|
"""Compatibility support for implementing load_compiled()."""
|
||||||
|
|
||||||
|
|
||||||
|
# XXX deprecate
|
||||||
def load_compiled(name, pathname, file=None):
|
def load_compiled(name, pathname, file=None):
|
||||||
return _LoadCompiledCompatibility(name, pathname, file).load_module(name)
|
return _LoadCompiledCompatibility(name, pathname, file).load_module(name)
|
||||||
|
|
||||||
|
|
||||||
|
# XXX deprecate
|
||||||
def load_package(name, path):
|
def load_package(name, path):
|
||||||
if os.path.isdir(path):
|
if os.path.isdir(path):
|
||||||
extensions = _bootstrap._suffix_list(PY_SOURCE)
|
extensions = _bootstrap._suffix_list(PY_SOURCE)
|
||||||
|
@ -82,6 +105,7 @@ def load_package(name, path):
|
||||||
return _bootstrap._SourceFileLoader(name, path).load_module(name)
|
return _bootstrap._SourceFileLoader(name, path).load_module(name)
|
||||||
|
|
||||||
|
|
||||||
|
# XXX deprecate
|
||||||
def load_module(name, file, filename, details):
|
def load_module(name, file, filename, details):
|
||||||
"""Load a module, given information returned by find_module().
|
"""Load a module, given information returned by find_module().
|
||||||
|
|
||||||
|
|
|
@ -180,6 +180,8 @@ def _new_module(name):
|
||||||
|
|
||||||
PYCACHE = '__pycache__'
|
PYCACHE = '__pycache__'
|
||||||
|
|
||||||
|
SOURCE_SUFFIXES = ['.py'] # _setup() adds .pyw as needed.
|
||||||
|
|
||||||
DEBUG_BYTECODE_SUFFIX = '.pyc'
|
DEBUG_BYTECODE_SUFFIX = '.pyc'
|
||||||
OPT_BYTECODE_SUFFIX = '.pyo'
|
OPT_BYTECODE_SUFFIX = '.pyo'
|
||||||
BYTECODE_SUFFIX = DEBUG_BYTECODE_SUFFIX if __debug__ else OPT_BYTECODE_SUFFIX
|
BYTECODE_SUFFIX = DEBUG_BYTECODE_SUFFIX if __debug__ else OPT_BYTECODE_SUFFIX
|
||||||
|
@ -199,7 +201,7 @@ def _cache_from_source(path, debug_override=None):
|
||||||
suffix = DEBUG_BYTECODE_SUFFIX if debug else OPT_BYTECODE_SUFFIX
|
suffix = DEBUG_BYTECODE_SUFFIX if debug else OPT_BYTECODE_SUFFIX
|
||||||
head, tail = _path_split(path)
|
head, tail = _path_split(path)
|
||||||
base_filename, sep, _ = tail.partition('.')
|
base_filename, sep, _ = tail.partition('.')
|
||||||
filename = '{}{}{}{}'.format(base_filename, sep, _imp.get_tag(), suffix)
|
filename = ''.join([base_filename, sep, _imp.get_tag(), suffix])
|
||||||
return _path_join(head, PYCACHE, filename)
|
return _path_join(head, PYCACHE, filename)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1195,6 +1197,8 @@ def _setup(sys_module, _imp_module):
|
||||||
# Constants
|
# Constants
|
||||||
setattr(self_module, '_relax_case', _make_relax_case())
|
setattr(self_module, '_relax_case', _make_relax_case())
|
||||||
setattr(self_module, '_MAGIC_NUMBER', _imp_module.get_magic())
|
setattr(self_module, '_MAGIC_NUMBER', _imp_module.get_magic())
|
||||||
|
if builtin_os == 'nt':
|
||||||
|
SOURCE_SUFFIXES.append('.pyw')
|
||||||
|
|
||||||
|
|
||||||
def _install(sys_module, _imp_module):
|
def _install(sys_module, _imp_module):
|
||||||
|
|
|
@ -2926,36 +2926,6 @@ PyDoc_STRVAR(doc_reload,
|
||||||
Reload the module. The module must have been successfully imported before.");
|
Reload the module. The module must have been successfully imported before.");
|
||||||
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
imp_source_from_cache(PyObject *self, PyObject *args, PyObject *kws)
|
|
||||||
{
|
|
||||||
static char *kwlist[] = {"path", NULL};
|
|
||||||
PyObject *pathname, *source;
|
|
||||||
|
|
||||||
if (!PyArg_ParseTupleAndKeywords(
|
|
||||||
args, kws, "O&", kwlist,
|
|
||||||
PyUnicode_FSDecoder, &pathname))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
source = make_source_pathname(pathname);
|
|
||||||
if (source == NULL) {
|
|
||||||
PyErr_Format(PyExc_ValueError, "Not a PEP 3147 pyc path: %R",
|
|
||||||
pathname);
|
|
||||||
Py_DECREF(pathname);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
Py_DECREF(pathname);
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
PyDoc_STRVAR(doc_source_from_cache,
|
|
||||||
"source_from_cache(path) -> path\n\
|
|
||||||
Given the path to a .pyc./.pyo file, return the path to its .py file.\n\
|
|
||||||
\n\
|
|
||||||
The .pyc/.pyo file does not need to exist; this simply returns the path to\n\
|
|
||||||
the .py file calculated to correspond to the .pyc/.pyo file. If path\n\
|
|
||||||
does not conform to PEP 3147 format, ValueError will be raised.");
|
|
||||||
|
|
||||||
/* Doc strings */
|
/* Doc strings */
|
||||||
|
|
||||||
PyDoc_STRVAR(doc_imp,
|
PyDoc_STRVAR(doc_imp,
|
||||||
|
@ -3007,9 +2977,6 @@ static PyMethodDef imp_methods[] = {
|
||||||
{"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},
|
||||||
{"reload", imp_reload, METH_O, doc_reload},
|
{"reload", imp_reload, METH_O, doc_reload},
|
||||||
{"source_from_cache", (PyCFunction)imp_source_from_cache,
|
|
||||||
METH_VARARGS | METH_KEYWORDS, doc_source_from_cache},
|
|
||||||
/* The rest are obsolete */
|
|
||||||
{"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
|
{"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
|
||||||
{"is_frozen_package", imp_is_frozen_package, METH_VARARGS},
|
{"is_frozen_package", imp_is_frozen_package, METH_VARARGS},
|
||||||
{"init_builtin", imp_init_builtin, METH_VARARGS},
|
{"init_builtin", imp_init_builtin, METH_VARARGS},
|
||||||
|
|
6332
Python/importlib.h
6332
Python/importlib.h
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue