mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-42955: Add sys.modules_names (GH-24238)
Add sys.module_names, containing the list of the standard library module names.
This commit is contained in:
		
							parent
							
								
									879986d8a9
								
							
						
					
					
						commit
						db584bdad3
					
				
					 10 changed files with 305 additions and 275 deletions
				
			
		|  | @ -17,27 +17,6 @@ | |||
|     '__pycache__', | ||||
|     'site-packages', | ||||
| 
 | ||||
|     # Helper modules of public modules. | ||||
|     # For example, sysconfig uses _osx_support. | ||||
|     '_aix_support', | ||||
|     '_collections_abc', | ||||
|     '_compat_pickle', | ||||
|     '_compression', | ||||
|     '_markupbase', | ||||
|     '_osx_support', | ||||
|     '_sitebuiltins', | ||||
|     '_strptime', | ||||
|     '_threading_local', | ||||
|     '_weakrefset', | ||||
| 
 | ||||
|     # Used to bootstrap setup.py | ||||
|     '_bootsubprocess', | ||||
| 
 | ||||
|     # pure Python implementation | ||||
|     '_py_abc', | ||||
|     '_pydecimal', | ||||
|     '_pyio', | ||||
| 
 | ||||
|     # test modules | ||||
|     '__phello__.foo', | ||||
|     '_ctypes_test', | ||||
|  | @ -69,40 +48,20 @@ | |||
| ) | ||||
| 
 | ||||
| 
 | ||||
| def write_comment(fp, comment): | ||||
|     print(f"// {comment}", file=fp) | ||||
| 
 | ||||
| 
 | ||||
| def write_modules(fp, names): | ||||
|     for name in sorted(names): | ||||
|         if name in IGNORE: | ||||
|             continue | ||||
|         print(f'"{name}",', file=fp) | ||||
|     print(file=fp) | ||||
| 
 | ||||
| 
 | ||||
| def list_builtin_modules(fp): | ||||
|     write_comment(fp, "Built-in modules") | ||||
|     write_modules(fp, sys.builtin_module_names) | ||||
| 
 | ||||
| 
 | ||||
| # Pure Python modules (Lib/*.py) | ||||
| def list_python_modules(fp): | ||||
|     write_comment(fp, "Pure Python modules (Lib/*.py)") | ||||
|     names = [] | ||||
| def list_python_modules(names): | ||||
|     for filename in os.listdir(STDLIB_PATH): | ||||
|         if not filename.endswith(".py"): | ||||
|             continue | ||||
|         name = filename.removesuffix(".py") | ||||
|         names.append(name) | ||||
|     write_modules(fp, names) | ||||
|         names.add(name) | ||||
| 
 | ||||
| 
 | ||||
| def _list_sub_packages(path, names, parent=None): | ||||
|     for name in os.listdir(path): | ||||
|         package_path = os.path.join(path, name) | ||||
|         if name in IGNORE: | ||||
|             continue | ||||
|         package_path = os.path.join(path, name) | ||||
|         if not os.path.isdir(package_path): | ||||
|             continue | ||||
|         if not any(package_file.endswith(".py") | ||||
|  | @ -114,40 +73,28 @@ def _list_sub_packages(path, names, parent=None): | |||
|             qualname = name | ||||
|         if qualname in IGNORE: | ||||
|             continue | ||||
|         names.append(qualname) | ||||
|         names.add(qualname) | ||||
|         _list_sub_packages(package_path, names, qualname) | ||||
| 
 | ||||
| 
 | ||||
| # Packages and sub-packages | ||||
| def list_packages(fp): | ||||
|     write_comment(fp, "Packages and sub-packages") | ||||
|     names = [] | ||||
| def list_packages(names): | ||||
|     _list_sub_packages(STDLIB_PATH, names) | ||||
|     write_modules(fp, names) | ||||
| 
 | ||||
| 
 | ||||
| # Windows extensions | ||||
| def list_windows_extensions(fp): | ||||
|     write_comment(fp, "Windows extension modules") | ||||
|     write_modules(fp, WINDOWS_MODULES) | ||||
| 
 | ||||
| 
 | ||||
| # Extension modules built by setup.py | ||||
| def list_setup(fp): | ||||
| def list_setup_extensions(names): | ||||
|     cmd = [sys.executable, SETUP_PY, "-q", "build", "--list-module-names"] | ||||
|     output = subprocess.check_output(cmd) | ||||
|     output = output.decode("utf8") | ||||
|     names = output.splitlines() | ||||
| 
 | ||||
|     write_comment(fp, "Extension modules built by setup.py") | ||||
|     write_modules(fp, names) | ||||
|     extensions = output.splitlines() | ||||
|     names |= set(extensions) | ||||
| 
 | ||||
| 
 | ||||
| # Built-in and extension modules built by Modules/Setup | ||||
| def list_modules_setup(fp): | ||||
| def list_modules_setup_extensions(names): | ||||
|     assign_var = re.compile("^[A-Z]+=") | ||||
| 
 | ||||
|     names = [] | ||||
|     with open(MODULES_SETUP, encoding="utf-8") as modules_fp: | ||||
|         for line in modules_fp: | ||||
|             # Strip comment | ||||
|  | @ -165,25 +112,26 @@ def list_modules_setup(fp): | |||
|                 continue | ||||
|             # "errno errnomodule.c" => write "errno" | ||||
|             name = parts[0] | ||||
|             names.append(name) | ||||
| 
 | ||||
|     write_comment(fp, "Built-in and extension modules built by Modules/Setup") | ||||
|     write_modules(fp, names) | ||||
|             names.add(name) | ||||
| 
 | ||||
| 
 | ||||
| def list_modules(fp): | ||||
| def list_modules(): | ||||
|     names = set(sys.builtin_module_names) | set(WINDOWS_MODULES) | ||||
|     list_modules_setup_extensions(names) | ||||
|     list_setup_extensions(names) | ||||
|     list_packages(names) | ||||
|     list_python_modules(names) | ||||
|     names -= set(IGNORE) | ||||
|     return names | ||||
| 
 | ||||
| 
 | ||||
| def write_modules(fp, names): | ||||
|     print("// Auto-generated by Tools/scripts/generate_module_names.py.", file=fp) | ||||
|     print("// List used to create sys.module_names.", file=fp) | ||||
|     print(file=fp) | ||||
|     print("static const char* _Py_module_names[] = {", file=fp) | ||||
|     print(file=fp) | ||||
| 
 | ||||
|     list_builtin_modules(fp) | ||||
|     list_python_modules(fp) | ||||
|     list_packages(fp) | ||||
|     list_setup(fp) | ||||
|     list_modules_setup(fp) | ||||
|     list_windows_extensions(fp) | ||||
| 
 | ||||
|     for name in sorted(names): | ||||
|         print(f'"{name}",', file=fp) | ||||
|     print("};", file=fp) | ||||
| 
 | ||||
| 
 | ||||
|  | @ -193,7 +141,9 @@ def main(): | |||
|               file=sys.stderr) | ||||
|         sys.exit(1) | ||||
| 
 | ||||
|     list_modules(sys.stdout) | ||||
|     fp = sys.stdout | ||||
|     names = list_modules() | ||||
|     write_modules(fp, names) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Victor Stinner
						Victor Stinner