| 
									
										
										
										
											2012-02-27 18:15:42 -05:00
										 |  |  | """A pure Python implementation of import.""" | 
					
						
							| 
									
										
										
										
											2013-06-14 15:04:26 -04:00
										 |  |  | __all__ = ['__import__', 'import_module', 'invalidate_caches', 'reload'] | 
					
						
							| 
									
										
										
										
											2009-03-12 22:01:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-17 22:33:38 +02:00
										 |  |  | # Bootstrap help ##################################################### | 
					
						
							| 
									
										
										
										
											2012-07-20 23:40:09 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Until bootstrapping is complete, DO NOT import any modules that attempt | 
					
						
							|  |  |  | # to import importlib._bootstrap (directly or indirectly). Since this | 
					
						
							|  |  |  | # partially initialised package would be present in sys.modules, those | 
					
						
							|  |  |  | # modules would get an uninitialised copy of the source version, instead | 
					
						
							|  |  |  | # of a fully initialised version (either the frozen one or the one | 
					
						
							|  |  |  | # initialised below if the frozen one is not available). | 
					
						
							|  |  |  | import _imp  # Just the builtin component, NOT the full Python module | 
					
						
							| 
									
										
										
										
											2012-06-17 22:33:38 +02:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2013-06-14 15:04:26 -04:00
										 |  |  | import types | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-17 22:33:38 +02:00
										 |  |  | try: | 
					
						
							| 
									
										
										
										
											2012-07-04 14:03:40 -04:00
										 |  |  |     import _frozen_importlib as _bootstrap | 
					
						
							| 
									
										
										
										
											2013-07-04 17:43:24 -04:00
										 |  |  | except ImportError: | 
					
						
							| 
									
										
										
										
											2012-06-17 22:33:38 +02:00
										 |  |  |     from . import _bootstrap | 
					
						
							| 
									
										
										
										
											2012-07-20 23:40:09 +10:00
										 |  |  |     _bootstrap._setup(sys, _imp) | 
					
						
							| 
									
										
										
										
											2012-06-17 22:33:38 +02:00
										 |  |  | else: | 
					
						
							|  |  |  |     # importlib._bootstrap is the built-in import, ensure we don't create | 
					
						
							|  |  |  |     # a second copy of the module. | 
					
						
							|  |  |  |     _bootstrap.__name__ = 'importlib._bootstrap' | 
					
						
							|  |  |  |     _bootstrap.__package__ = 'importlib' | 
					
						
							|  |  |  |     _bootstrap.__file__ = __file__.replace('__init__.py', '_bootstrap.py') | 
					
						
							|  |  |  |     sys.modules['importlib._bootstrap'] = _bootstrap | 
					
						
							| 
									
										
										
										
											2009-01-18 00:24:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-25 18:58:03 -05:00
										 |  |  | # To simplify imports in test code | 
					
						
							|  |  |  | _w_long = _bootstrap._w_long | 
					
						
							|  |  |  | _r_long = _bootstrap._r_long | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-20 23:40:09 +10:00
										 |  |  | # Fully bootstrapped at this point, import whatever you like, circular | 
					
						
							|  |  |  | # dependencies and startup overhead minimisation permitting :) | 
					
						
							| 
									
										
										
										
											2012-01-25 18:58:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-22 22:44:04 +00:00
										 |  |  | # Public API ######################################################### | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-27 18:15:42 -05:00
										 |  |  | from ._bootstrap import __import__ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def invalidate_caches(): | 
					
						
							| 
									
										
										
										
											2012-08-10 12:21:12 -04:00
										 |  |  |     """Call the invalidate_caches() method on all meta path finders stored in
 | 
					
						
							|  |  |  |     sys.meta_path (where implemented)."""
 | 
					
						
							|  |  |  |     for finder in sys.meta_path: | 
					
						
							| 
									
										
										
										
											2012-02-27 18:15:42 -05:00
										 |  |  |         if hasattr(finder, 'invalidate_caches'): | 
					
						
							|  |  |  |             finder.invalidate_caches() | 
					
						
							| 
									
										
										
										
											2009-01-20 02:21:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  | def find_loader(name, path=None): | 
					
						
							|  |  |  |     """Find the loader for the specified module.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     First, sys.modules is checked to see if the module was already imported. If | 
					
						
							|  |  |  |     so, then sys.modules[name].__loader__ is returned. If that happens to be | 
					
						
							|  |  |  |     set to None, then ValueError is raised. If the module is not in | 
					
						
							|  |  |  |     sys.modules, then sys.meta_path is searched for a suitable loader with the | 
					
						
							|  |  |  |     value of 'path' given to the finders. None is returned if no loader could | 
					
						
							|  |  |  |     be found. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-17 09:30:55 -05:00
										 |  |  |     Dotted names do not have their parent packages implicitly imported. You will | 
					
						
							|  |  |  |     most likely need to explicitly import all parent packages in the proper | 
					
						
							|  |  |  |     order for a submodule to get the correct loader. | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         loader = sys.modules[name].__loader__ | 
					
						
							|  |  |  |         if loader is None: | 
					
						
							|  |  |  |             raise ValueError('{}.__loader__ is None'.format(name)) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return loader | 
					
						
							|  |  |  |     except KeyError: | 
					
						
							|  |  |  |         pass | 
					
						
							| 
									
										
										
										
											2013-03-13 11:09:08 -07:00
										 |  |  |     except AttributeError: | 
					
						
							|  |  |  |         raise ValueError('{}.__loader__ is not set'.format(name)) | 
					
						
							| 
									
										
										
										
											2012-05-12 17:43:17 -04:00
										 |  |  |     return _bootstrap._find_module(name, path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 02:21:27 +00:00
										 |  |  | def import_module(name, package=None): | 
					
						
							|  |  |  |     """Import a module.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The 'package' argument is required when performing a relative import. It | 
					
						
							|  |  |  |     specifies the package to use as the anchor point from which to resolve the | 
					
						
							|  |  |  |     relative import to an absolute import. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2009-02-07 01:15:27 +00:00
										 |  |  |     level = 0 | 
					
						
							| 
									
										
										
										
											2009-01-20 02:21:27 +00:00
										 |  |  |     if name.startswith('.'): | 
					
						
							|  |  |  |         if not package: | 
					
						
							| 
									
										
										
										
											2013-08-12 13:29:11 -04:00
										 |  |  |             msg = ("the 'package' argument is required to perform a relative " | 
					
						
							|  |  |  |                    "import for {!r}") | 
					
						
							|  |  |  |             raise TypeError(msg.format(name)) | 
					
						
							| 
									
										
										
										
											2009-01-20 02:21:27 +00:00
										 |  |  |         for character in name: | 
					
						
							|  |  |  |             if character != '.': | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |             level += 1 | 
					
						
							| 
									
										
										
										
											2009-02-07 01:15:27 +00:00
										 |  |  |     return _bootstrap._gcd_import(name[level:], package, level) | 
					
						
							| 
									
										
										
										
											2013-06-14 15:04:26 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _RELOADING = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def reload(module): | 
					
						
							|  |  |  |     """Reload the module and return it.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The module must have been successfully imported before. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if not module or not isinstance(module, types.ModuleType): | 
					
						
							|  |  |  |         raise TypeError("reload() argument must be module") | 
					
						
							|  |  |  |     name = module.__name__ | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |     if sys.modules.get(name) is not module: | 
					
						
							| 
									
										
										
										
											2013-06-14 15:04:26 -04:00
										 |  |  |         msg = "module {} not in sys.modules" | 
					
						
							|  |  |  |         raise ImportError(msg.format(name), name=name) | 
					
						
							|  |  |  |     if name in _RELOADING: | 
					
						
							|  |  |  |         return _RELOADING[name] | 
					
						
							|  |  |  |     _RELOADING[name] = module | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         parent_name = name.rpartition('.')[0] | 
					
						
							|  |  |  |         if parent_name and parent_name not in sys.modules: | 
					
						
							|  |  |  |             msg = "parent {!r} not in sys.modules" | 
					
						
							| 
									
										
										
										
											2013-08-10 20:01:43 +03:00
										 |  |  |             raise ImportError(msg.format(parent_name), name=parent_name) | 
					
						
							| 
									
										
										
										
											2013-10-31 22:22:15 -06:00
										 |  |  |         loader = _bootstrap._find_module(name, None) | 
					
						
							|  |  |  |         if loader is None: | 
					
						
							|  |  |  |             raise ImportError(_bootstrap._ERR_MSG.format(name), name=name) | 
					
						
							|  |  |  |         module.__loader__ = loader | 
					
						
							|  |  |  |         loader.load_module(name) | 
					
						
							| 
									
										
										
										
											2013-08-14 18:11:09 -06:00
										 |  |  |         # The module may have replaced itself in sys.modules! | 
					
						
							|  |  |  |         return sys.modules[module.__name__] | 
					
						
							| 
									
										
										
										
											2013-06-14 15:04:26 -04:00
										 |  |  |     finally: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             del _RELOADING[name] | 
					
						
							|  |  |  |         except KeyError: | 
					
						
							|  |  |  |             pass |