Lib/imp.py.
This commit is contained in:
parent
afbb5fbeb8
commit
77b2abd094
|
@ -172,7 +172,10 @@ Importing Modules
|
|||
|
||||
Return the magic number for Python bytecode files (a.k.a. :file:`.pyc` and
|
||||
:file:`.pyo` files). The magic number should be present in the first four bytes
|
||||
of the bytecode file, in little-endian byte order.
|
||||
of the bytecode file, in little-endian byte order. Returns -1 on error.
|
||||
|
||||
.. versionchanged:: 3.3
|
||||
Return value of -1 upon failure.
|
||||
|
||||
|
||||
.. c:function:: const char * PyImport_GetMagicTag()
|
||||
|
|
|
@ -1761,6 +1761,9 @@ Porting C code
|
|||
:c:func:`PyUnicode_FromFormat()`, your code will automatically take
|
||||
advantage of the new unicode representations.
|
||||
|
||||
* :c:func:`PyImport_GetMagicNumber` now returns -1 upon failure.
|
||||
|
||||
|
||||
Building C extensions
|
||||
---------------------
|
||||
|
||||
|
|
|
@ -10,12 +10,12 @@ from _imp import (lock_held, acquire_lock, release_lock,
|
|||
load_dynamic, get_frozen_object, is_frozen_package,
|
||||
init_builtin, init_frozen, is_builtin, is_frozen,
|
||||
_fix_co_filename, extension_suffixes)
|
||||
# Could move out of _imp, but not worth the code
|
||||
from _imp import get_magic
|
||||
|
||||
# Directly exposed by this module
|
||||
from importlib._bootstrap import new_module
|
||||
from importlib._bootstrap import cache_from_source
|
||||
|
||||
|
||||
from importlib import _bootstrap
|
||||
from importlib import machinery
|
||||
import os
|
||||
|
@ -37,6 +37,11 @@ PY_CODERESOURCE = 8
|
|||
IMP_HOOK = 9
|
||||
|
||||
|
||||
def get_magic():
|
||||
"""Return the magic number for .pyc or .pyo files."""
|
||||
return _bootstrap._MAGIC_BYTES
|
||||
|
||||
|
||||
def get_tag():
|
||||
"""Return the magic tag for .pyc or .pyo files."""
|
||||
return sys.implementation.cache_tag
|
||||
|
|
|
@ -300,6 +300,96 @@ def _lock_unlock_module(name):
|
|||
|
||||
# Finder/loader utility code ##################################################
|
||||
|
||||
"""Magic word to reject .pyc files generated by other Python versions.
|
||||
It should change for each incompatible change to the bytecode.
|
||||
|
||||
The value of CR and LF is incorporated so if you ever read or write
|
||||
a .pyc file in text mode the magic number will be wrong; also, the
|
||||
Apple MPW compiler swaps their values, botching string constants.
|
||||
|
||||
The magic numbers must be spaced apart at least 2 values, as the
|
||||
-U interpeter flag will cause MAGIC+1 being used. They have been
|
||||
odd numbers for some time now.
|
||||
|
||||
There were a variety of old schemes for setting the magic number.
|
||||
The current working scheme is to increment the previous value by
|
||||
10.
|
||||
|
||||
Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic
|
||||
number also includes a new "magic tag", i.e. a human readable string used
|
||||
to represent the magic number in __pycache__ directories. When you change
|
||||
the magic number, you must also set a new unique magic tag. Generally this
|
||||
can be named after the Python major version of the magic number bump, but
|
||||
it can really be anything, as long as it's different than anything else
|
||||
that's come before. The tags are included in the following table, starting
|
||||
with Python 3.2a0.
|
||||
|
||||
Known values:
|
||||
Python 1.5: 20121
|
||||
Python 1.5.1: 20121
|
||||
Python 1.5.2: 20121
|
||||
Python 1.6: 50428
|
||||
Python 2.0: 50823
|
||||
Python 2.0.1: 50823
|
||||
Python 2.1: 60202
|
||||
Python 2.1.1: 60202
|
||||
Python 2.1.2: 60202
|
||||
Python 2.2: 60717
|
||||
Python 2.3a0: 62011
|
||||
Python 2.3a0: 62021
|
||||
Python 2.3a0: 62011 (!)
|
||||
Python 2.4a0: 62041
|
||||
Python 2.4a3: 62051
|
||||
Python 2.4b1: 62061
|
||||
Python 2.5a0: 62071
|
||||
Python 2.5a0: 62081 (ast-branch)
|
||||
Python 2.5a0: 62091 (with)
|
||||
Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
|
||||
Python 2.5b3: 62101 (fix wrong code: for x, in ...)
|
||||
Python 2.5b3: 62111 (fix wrong code: x += yield)
|
||||
Python 2.5c1: 62121 (fix wrong lnotab with for loops and
|
||||
storing constants that should have been removed)
|
||||
Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
|
||||
Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
|
||||
Python 2.6a1: 62161 (WITH_CLEANUP optimization)
|
||||
Python 3000: 3000
|
||||
3010 (removed UNARY_CONVERT)
|
||||
3020 (added BUILD_SET)
|
||||
3030 (added keyword-only parameters)
|
||||
3040 (added signature annotations)
|
||||
3050 (print becomes a function)
|
||||
3060 (PEP 3115 metaclass syntax)
|
||||
3061 (string literals become unicode)
|
||||
3071 (PEP 3109 raise changes)
|
||||
3081 (PEP 3137 make __file__ and __name__ unicode)
|
||||
3091 (kill str8 interning)
|
||||
3101 (merge from 2.6a0, see 62151)
|
||||
3103 (__file__ points to source file)
|
||||
Python 3.0a4: 3111 (WITH_CLEANUP optimization).
|
||||
Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT)
|
||||
Python 3.1a0: 3141 (optimize list, set and dict comprehensions:
|
||||
change LIST_APPEND and SET_ADD, add MAP_ADD)
|
||||
Python 3.1a0: 3151 (optimize conditional branches:
|
||||
introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
|
||||
Python 3.2a0: 3160 (add SETUP_WITH)
|
||||
tag: cpython-32
|
||||
Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
|
||||
tag: cpython-32
|
||||
Python 3.2a2 3180 (add DELETE_DEREF)
|
||||
Python 3.3a0 3190 __class__ super closure changed
|
||||
Python 3.3a0 3200 (__qualname__ added)
|
||||
3210 (added size modulo 2**32 to the pyc header)
|
||||
Python 3.3a1 3220 (changed PEP 380 implementation)
|
||||
Python 3.3a4 3230 (revert changes to implicit __class__ closure)
|
||||
|
||||
MAGIC must change whenever the bytecode emitted by the compiler may no
|
||||
longer be understood by older implementations of the eval loop (usually
|
||||
due to the addition of new opcodes).
|
||||
|
||||
"""
|
||||
_RAW_MAGIC_NUMBER = 3230 | ord('\r') << 16 | ord('\n') << 24
|
||||
_MAGIC_BYTES = bytes(_RAW_MAGIC_NUMBER >> n & 0xff for n in range(0, 25, 8))
|
||||
|
||||
_PYCACHE = '__pycache__'
|
||||
|
||||
SOURCE_SUFFIXES = ['.py'] # _setup() adds .pyw as needed.
|
||||
|
@ -611,7 +701,7 @@ class _LoaderBasics:
|
|||
magic = data[:4]
|
||||
raw_timestamp = data[4:8]
|
||||
raw_size = data[8:12]
|
||||
if magic != _MAGIC_NUMBER:
|
||||
if magic != _MAGIC_BYTES:
|
||||
msg = 'bad magic number in {!r}: {!r}'.format(fullname, magic)
|
||||
raise ImportError(msg, name=fullname, path=bytecode_path)
|
||||
elif len(raw_timestamp) != 4:
|
||||
|
@ -768,7 +858,7 @@ class SourceLoader(_LoaderBasics):
|
|||
_verbose_message('code object from {}', source_path)
|
||||
if (not sys.dont_write_bytecode and bytecode_path is not None and
|
||||
source_mtime is not None):
|
||||
data = bytearray(_MAGIC_NUMBER)
|
||||
data = bytearray(_MAGIC_BYTES)
|
||||
data.extend(_w_long(source_mtime))
|
||||
data.extend(_w_long(len(source_bytes)))
|
||||
data.extend(marshal.dumps(code_object))
|
||||
|
@ -1427,8 +1517,6 @@ def __import__(name, globals={}, locals={}, fromlist=[], level=0):
|
|||
return _handle_fromlist(module, fromlist, _gcd_import)
|
||||
|
||||
|
||||
_MAGIC_NUMBER = None # Set in _setup()
|
||||
|
||||
|
||||
def _setup(sys_module, _imp_module):
|
||||
"""Setup importlib by importing needed built-in modules and injecting them
|
||||
|
@ -1488,7 +1576,6 @@ def _setup(sys_module, _imp_module):
|
|||
setattr(self_module, 'path_separators', set(path_separators))
|
||||
# Constants
|
||||
setattr(self_module, '_relax_case', _make_relax_case())
|
||||
setattr(self_module, '_MAGIC_NUMBER', _imp_module.get_magic())
|
||||
if builtin_os == 'nt':
|
||||
SOURCE_SUFFIXES.append('.pyw')
|
||||
|
||||
|
|
126
Python/import.c
126
Python/import.c
|
@ -27,97 +27,7 @@ typedef unsigned short mode_t;
|
|||
#endif
|
||||
|
||||
|
||||
/* Magic word to reject .pyc files generated by other Python versions.
|
||||
It should change for each incompatible change to the bytecode.
|
||||
|
||||
The value of CR and LF is incorporated so if you ever read or write
|
||||
a .pyc file in text mode the magic number will be wrong; also, the
|
||||
Apple MPW compiler swaps their values, botching string constants.
|
||||
|
||||
The magic numbers must be spaced apart at least 2 values, as the
|
||||
-U interpeter flag will cause MAGIC+1 being used. They have been
|
||||
odd numbers for some time now.
|
||||
|
||||
There were a variety of old schemes for setting the magic number.
|
||||
The current working scheme is to increment the previous value by
|
||||
10.
|
||||
|
||||
Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic
|
||||
number also includes a new "magic tag", i.e. a human readable string used
|
||||
to represent the magic number in __pycache__ directories. When you change
|
||||
the magic number, you must also set a new unique magic tag. Generally this
|
||||
can be named after the Python major version of the magic number bump, but
|
||||
it can really be anything, as long as it's different than anything else
|
||||
that's come before. The tags are included in the following table, starting
|
||||
with Python 3.2a0.
|
||||
|
||||
Known values:
|
||||
Python 1.5: 20121
|
||||
Python 1.5.1: 20121
|
||||
Python 1.5.2: 20121
|
||||
Python 1.6: 50428
|
||||
Python 2.0: 50823
|
||||
Python 2.0.1: 50823
|
||||
Python 2.1: 60202
|
||||
Python 2.1.1: 60202
|
||||
Python 2.1.2: 60202
|
||||
Python 2.2: 60717
|
||||
Python 2.3a0: 62011
|
||||
Python 2.3a0: 62021
|
||||
Python 2.3a0: 62011 (!)
|
||||
Python 2.4a0: 62041
|
||||
Python 2.4a3: 62051
|
||||
Python 2.4b1: 62061
|
||||
Python 2.5a0: 62071
|
||||
Python 2.5a0: 62081 (ast-branch)
|
||||
Python 2.5a0: 62091 (with)
|
||||
Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
|
||||
Python 2.5b3: 62101 (fix wrong code: for x, in ...)
|
||||
Python 2.5b3: 62111 (fix wrong code: x += yield)
|
||||
Python 2.5c1: 62121 (fix wrong lnotab with for loops and
|
||||
storing constants that should have been removed)
|
||||
Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
|
||||
Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
|
||||
Python 2.6a1: 62161 (WITH_CLEANUP optimization)
|
||||
Python 3000: 3000
|
||||
3010 (removed UNARY_CONVERT)
|
||||
3020 (added BUILD_SET)
|
||||
3030 (added keyword-only parameters)
|
||||
3040 (added signature annotations)
|
||||
3050 (print becomes a function)
|
||||
3060 (PEP 3115 metaclass syntax)
|
||||
3061 (string literals become unicode)
|
||||
3071 (PEP 3109 raise changes)
|
||||
3081 (PEP 3137 make __file__ and __name__ unicode)
|
||||
3091 (kill str8 interning)
|
||||
3101 (merge from 2.6a0, see 62151)
|
||||
3103 (__file__ points to source file)
|
||||
Python 3.0a4: 3111 (WITH_CLEANUP optimization).
|
||||
Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT)
|
||||
Python 3.1a0: 3141 (optimize list, set and dict comprehensions:
|
||||
change LIST_APPEND and SET_ADD, add MAP_ADD)
|
||||
Python 3.1a0: 3151 (optimize conditional branches:
|
||||
introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
|
||||
Python 3.2a0: 3160 (add SETUP_WITH)
|
||||
tag: cpython-32
|
||||
Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
|
||||
tag: cpython-32
|
||||
Python 3.2a2 3180 (add DELETE_DEREF)
|
||||
Python 3.3a0 3190 __class__ super closure changed
|
||||
Python 3.3a0 3200 (__qualname__ added)
|
||||
3210 (added size modulo 2**32 to the pyc header)
|
||||
Python 3.3a1 3220 (changed PEP 380 implementation)
|
||||
Python 3.3a4 3230 (revert changes to implicit __class__ closure)
|
||||
*/
|
||||
|
||||
/* MAGIC must change whenever the bytecode emitted by the compiler may no
|
||||
longer be understood by older implementations of the eval loop (usually
|
||||
due to the addition of new opcodes)
|
||||
*/
|
||||
#define MAGIC (3230 | ((long)'\r'<<16) | ((long)'\n'<<24))
|
||||
#define CACHEDIR "__pycache__"
|
||||
/* Current magic word as global. */
|
||||
static long pyc_magic = MAGIC;
|
||||
|
||||
/* See _PyImport_FixupExtensionObject() below */
|
||||
static PyObject *extensions = NULL;
|
||||
|
@ -516,7 +426,12 @@ PyImport_Cleanup(void)
|
|||
long
|
||||
PyImport_GetMagicNumber(void)
|
||||
{
|
||||
return pyc_magic;
|
||||
PyInterpreterState *interp = PyThreadState_Get()->interp;
|
||||
PyObject *pyc_magic = PyObject_GetAttrString(interp->importlib,
|
||||
"_RAW_MAGIC_NUMBER");
|
||||
if (pyc_magic == NULL)
|
||||
return -1;
|
||||
return PyLong_AsLong(pyc_magic);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1879,30 +1794,6 @@ PyImport_Import(PyObject *module_name)
|
|||
return r;
|
||||
}
|
||||
|
||||
|
||||
/* Module 'imp' provides Python access to the primitives used for
|
||||
importing modules.
|
||||
*/
|
||||
|
||||
static PyObject *
|
||||
imp_make_magic(long magic)
|
||||
{
|
||||
char buf[4];
|
||||
|
||||
buf[0] = (char) ((magic >> 0) & 0xff);
|
||||
buf[1] = (char) ((magic >> 8) & 0xff);
|
||||
buf[2] = (char) ((magic >> 16) & 0xff);
|
||||
buf[3] = (char) ((magic >> 24) & 0xff);
|
||||
|
||||
return PyBytes_FromStringAndSize(buf, 4);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
imp_get_magic(PyObject *self, PyObject *noargs)
|
||||
{
|
||||
return imp_make_magic(pyc_magic);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
imp_extension_suffixes(PyObject *self, PyObject *noargs)
|
||||
{
|
||||
|
@ -2049,10 +1940,6 @@ imp_load_dynamic(PyObject *self, PyObject *args)
|
|||
PyDoc_STRVAR(doc_imp,
|
||||
"(Extremely) low-level import machinery bits as used by importlib and imp.");
|
||||
|
||||
PyDoc_STRVAR(doc_get_magic,
|
||||
"get_magic() -> string\n\
|
||||
Return the magic number for .pyc or .pyo files.");
|
||||
|
||||
PyDoc_STRVAR(doc_extension_suffixes,
|
||||
"extension_suffixes() -> list of strings\n\
|
||||
Returns the list of file suffixes used to identify extension modules.");
|
||||
|
@ -2075,7 +1962,6 @@ Release the interpreter's import lock.\n\
|
|||
On platforms without threads, this function does nothing.");
|
||||
|
||||
static PyMethodDef imp_methods[] = {
|
||||
{"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
|
||||
{"extension_suffixes", imp_extension_suffixes, METH_NOARGS,
|
||||
doc_extension_suffixes},
|
||||
{"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
|
||||
|
|
7640
Python/importlib.h
7640
Python/importlib.h
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue