Issue #15167 (as part of #13959): imp.get_magic() is no implemented in
Lib/imp.py.
diff --git a/Lib/imp.py b/Lib/imp.py
index dab8312..58d1c97 100644
--- a/Lib/imp.py
+++ b/Lib/imp.py
@@ -10,12 +10,12 @@
                   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 @@
 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
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
index 35c6e50..618dd26 100644
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -300,6 +300,96 @@
 
 # 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 @@
         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 @@
         _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 @@
         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 @@
     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')