mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	Issue #14578: Support modules registered in the Windows registry again.
Patch by Amaury Forgeot d'Arc.
This commit is contained in:
		
							parent
							
								
									96d97ec9c0
								
							
						
					
					
						commit
						e3010a8d12
					
				
					 3 changed files with 4230 additions and 3975 deletions
				
			
		|  | @ -722,6 +722,56 @@ def _exec_module(cls, fullname): | |||
|         return _imp.init_frozen(fullname) | ||||
| 
 | ||||
| 
 | ||||
| class WindowsRegistryImporter: | ||||
| 
 | ||||
|     """Meta path import for modules declared in the Windows registry. | ||||
|     """ | ||||
| 
 | ||||
|     REGISTRY_KEY = ( | ||||
|         "Software\\Python\\PythonCore\\{sys_version}" | ||||
|         "\\Modules\\{fullname}") | ||||
|     REGISTRY_KEY_DEBUG = ( | ||||
|         "Software\\Python\\PythonCore\\{sys_version}" | ||||
|         "\\Modules\\{fullname}\\Debug") | ||||
|     DEBUG_BUILD = False  # Changed in _setup() | ||||
| 
 | ||||
|     @classmethod | ||||
|     def _open_registry(cls, key): | ||||
|         try: | ||||
|             return _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, key) | ||||
|         except WindowsError: | ||||
|             return _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key) | ||||
| 
 | ||||
|     @classmethod | ||||
|     def _search_registry(cls, fullname): | ||||
|         if cls.DEBUG_BUILD: | ||||
|             registry_key = cls.REGISTRY_KEY_DEBUG | ||||
|         else: | ||||
|             registry_key = cls.REGISTRY_KEY | ||||
|         key = registry_key.format(fullname=fullname, | ||||
|                                   sys_version=sys.version[:3]) | ||||
|         try: | ||||
|             with cls._open_registry(key) as hkey: | ||||
|                 filepath = _winreg.QueryValue(hkey, "") | ||||
|         except WindowsError: | ||||
|             return None | ||||
|         return filepath | ||||
| 
 | ||||
|     @classmethod | ||||
|     def find_module(cls, fullname, path=None): | ||||
|         """Find module named in the registry.""" | ||||
|         filepath = cls._search_registry(fullname) | ||||
|         if filepath is None: | ||||
|             return None | ||||
|         try: | ||||
|             _os.stat(filepath) | ||||
|         except OSError: | ||||
|             return None | ||||
|         for loader, suffixes, _ in _get_supported_file_loaders(): | ||||
|             if filepath.endswith(tuple(suffixes)): | ||||
|                 return loader(fullname, filepath) | ||||
| 
 | ||||
| 
 | ||||
| class _LoaderBasics: | ||||
| 
 | ||||
|     """Base class of common code needed by both SourceLoader and | ||||
|  | @ -1538,6 +1588,17 @@ def _calc___package__(globals): | |||
|     return package | ||||
| 
 | ||||
| 
 | ||||
| def _get_supported_file_loaders(): | ||||
|     """Returns a list of file-based module loaders. | ||||
| 
 | ||||
|     Each item is a tuple (loader, suffixes, allow_packages). | ||||
|     """ | ||||
|     extensions = ExtensionFileLoader, _imp.extension_suffixes(), False | ||||
|     source = SourceFileLoader, SOURCE_SUFFIXES, True | ||||
|     bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES, True | ||||
|     return [extensions, source, bytecode] | ||||
| 
 | ||||
| 
 | ||||
| def __import__(name, globals={}, locals={}, fromlist=[], level=0): | ||||
|     """Import a module. | ||||
| 
 | ||||
|  | @ -1620,6 +1681,10 @@ def _setup(sys_module, _imp_module): | |||
|         thread_module = None | ||||
|     weakref_module = BuiltinImporter.load_module('_weakref') | ||||
| 
 | ||||
|     if builtin_os == 'nt': | ||||
|         winreg_module = BuiltinImporter.load_module('winreg') | ||||
|         setattr(self_module, '_winreg', winreg_module) | ||||
| 
 | ||||
|     setattr(self_module, '_os', os_module) | ||||
|     setattr(self_module, '_thread', thread_module) | ||||
|     setattr(self_module, '_weakref', weakref_module) | ||||
|  | @ -1629,14 +1694,17 @@ def _setup(sys_module, _imp_module): | |||
|     setattr(self_module, '_relax_case', _make_relax_case()) | ||||
|     if builtin_os == 'nt': | ||||
|         SOURCE_SUFFIXES.append('.pyw') | ||||
|         if '_d.pyd' in _imp.extension_suffixes(): | ||||
|             WindowsRegistryImporter.DEBUG_BUILD = True | ||||
| 
 | ||||
| 
 | ||||
| def _install(sys_module, _imp_module): | ||||
|     """Install importlib as the implementation of import.""" | ||||
|     _setup(sys_module, _imp_module) | ||||
|     extensions = ExtensionFileLoader, _imp_module.extension_suffixes(), False | ||||
|     source = SourceFileLoader, SOURCE_SUFFIXES, True | ||||
|     bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES, True | ||||
|     supported_loaders = [extensions, source, bytecode] | ||||
|     supported_loaders = _get_supported_file_loaders() | ||||
|     sys.path_hooks.extend([FileFinder.path_hook(*supported_loaders)]) | ||||
|     sys.meta_path.extend([BuiltinImporter, FrozenImporter, PathFinder]) | ||||
|     sys.meta_path.append(BuiltinImporter) | ||||
|     sys.meta_path.append(FrozenImporter) | ||||
|     if _os.__name__ == 'nt': | ||||
|         sys.meta_path.append(WindowsRegistryImporter) | ||||
|     sys.meta_path.append(PathFinder) | ||||
|  |  | |||
|  | @ -10,6 +10,8 @@ What's New in Python 3.3.0 Beta 2? | |||
| Core and Builtins | ||||
| ----------------- | ||||
| 
 | ||||
| - Issue #14578: Support modules registered in the Windows registry again. | ||||
| 
 | ||||
| - Issue #15466: Stop using TYPE_INT64 in marshal, to make importlib.h | ||||
|   (and other byte code files) equal between 32-bit and 64-bit systems. | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										8125
									
								
								Python/importlib.h
									
										
									
									
									
								
							
							
						
						
									
										8125
									
								
								Python/importlib.h
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Martin v. Löwis
						Martin v. Löwis