diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6a41b518245..48b5825db04 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -63,7 +63,7 @@ jobs: # Build Python with the libpython dynamic library ./configure --with-pydebug --enable-shared make -j4 regen-all - make regen-module-names + make regen-stdlib-module-names - name: Check for changes run: | changes=$(git status --porcelain) diff --git a/.travis.yml b/.travis.yml index c908891b2e3..6a22d20455b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -172,7 +172,7 @@ before_script: - eval "$(pyenv init -)" - pyenv global 3.8 - PYTHON_FOR_REGEN=python3.8 make -j4 regen-all - - make regen-module-names + - make regen-stdlib-module-names - changes=`git status --porcelain` - | # Check for changes in regenerated files diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index f187895410c..0219ae8ceb6 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -157,7 +157,7 @@ always available. Python interpreter. (This information is not available in any other way --- ``modules.keys()`` only lists the imported modules.) - See also the :attr:`sys.module_names` list. + See also the :attr:`sys.stdlib_module_names` list. .. function:: call_tracing(func, args) @@ -1062,24 +1062,6 @@ always available. This is still called as a fallback if a :data:`meta_path` entry doesn't have a :meth:`~importlib.abc.MetaPathFinder.find_spec` method. -.. data:: module_names - - A frozenset of strings containing the names of standard library modules. - - It is the same on all platforms. Modules which are not available on - some platforms and modules disabled at Python build are also listed. - All module kinds are listed: pure Python, built-in, frozen and extension - modules. Test modules are excluded. - - For packages, only sub-packages are listed, not sub-modules. For example, - ``concurrent`` package and ``concurrent.futures`` sub-package are listed, - but not ``concurrent.futures.base`` sub-module. - - See also the :attr:`sys.builtin_module_names` list. - - .. versionadded:: 3.10 - - .. data:: modules This is a dictionary that maps module names to modules which have already been @@ -1584,6 +1566,24 @@ always available. to a console and Python apps started with :program:`pythonw`. +.. data:: stdlib_module_names + + A frozenset of strings containing the names of standard library modules. + + It is the same on all platforms. Modules which are not available on + some platforms and modules disabled at Python build are also listed. + All module kinds are listed: pure Python, built-in, frozen and extension + modules. Test modules are excluded. + + For packages, only sub-packages are listed, not sub-modules. For example, + ``concurrent`` package and ``concurrent.futures`` sub-package are listed, + but not ``concurrent.futures.base`` sub-module. + + See also the :attr:`sys.builtin_module_names` list. + + .. versionadded:: 3.10 + + .. data:: thread_info A :term:`named tuple` holding information about the thread diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 3026a1ac0e5..30a82816444 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -396,7 +396,7 @@ Add :data:`sys.orig_argv` attribute: the list of the original command line arguments passed to the Python executable. (Contributed by Victor Stinner in :issue:`23427`.) -Add :data:`sys.module_names`, containing the list of the standard library +Add :data:`sys.stdlib_module_names`, containing the list of the standard library module names. (Contributed by Victor Stinner in :issue:`42955`.) diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 5f5c0d038d9..8e92a50026c 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -581,7 +581,7 @@ class CAPITest(unittest.TestCase): not_expected = ('_testcapi',) code = textwrap.dedent(''' import _testcapi, sys - sys.module_names = frozenset({"_testcapi"}) + sys.stdlib_module_names = frozenset({"_testcapi"}) _testcapi.fatal_error(b"MESSAGE") ''') self.check_fatal_error(code, expected) diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index 02077a69bb4..648624482e5 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -336,7 +336,7 @@ class FaultHandlerTests(unittest.TestCase): import faulthandler import sys # Don't filter stdlib module names - sys.module_names = frozenset() + sys.stdlib_module_names = frozenset() faulthandler.enable() faulthandler._sigsegv() """ diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 729b8667fc8..c4e05359480 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -987,8 +987,8 @@ class SysModuleTest(unittest.TestCase): proc) def test_module_names(self): - self.assertIsInstance(sys.module_names, frozenset) - for name in sys.module_names: + self.assertIsInstance(sys.stdlib_module_names, frozenset) + for name in sys.stdlib_module_names: self.assertIsInstance(name, str) diff --git a/Makefile.pre.in b/Makefile.pre.in index ca6b5189c75..0b22bdd5591 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -760,7 +760,7 @@ regen-all: regen-opcode regen-opcode-targets regen-typeslots \ regen-token regen-ast regen-keyword regen-importlib clinic \ regen-pegen-metaparser regen-pegen @echo - @echo "Note: make regen-module-names and autoconf should be run manually" + @echo "Note: make regen-stdlib-module-names and autoconf should be run manually" ############################################################################ # Special rules for object files @@ -900,14 +900,14 @@ regen-keyword: $(srcdir)/Lib/keyword.py.new $(UPDATE_FILE) $(srcdir)/Lib/keyword.py $(srcdir)/Lib/keyword.py.new -.PHONY: regen-module-names -regen-module-names: build_all - # Regenerate Python/module_names.h - # using Tools/scripts/generate_module_names.py +.PHONY: regen-stdlib-module-names +regen-stdlib-module-names: build_all + # Regenerate Python/stdlib_module_names.h + # using Tools/scripts/generate_stdlib_module_names.py $(RUNSHARED) ./$(BUILDPYTHON) \ - $(srcdir)/Tools/scripts/generate_module_names.py \ - > $(srcdir)/Python/module_names.h.new - $(UPDATE_FILE) $(srcdir)/Python/module_names.h $(srcdir)/Python/module_names.h.new + $(srcdir)/Tools/scripts/generate_stdlib_module_names.py \ + > $(srcdir)/Python/stdlib_module_names.h.new + $(UPDATE_FILE) $(srcdir)/Python/stdlib_module_names.h $(srcdir)/Python/stdlib_module_names.h.new Python/compile.o Python/symtable.o Python/ast_unparse.o Python/ast.o Python/future.o: $(srcdir)/Include/Python-ast.h @@ -1160,7 +1160,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_warnings.h \ $(DTRACE_HEADERS) \ \ - $(srcdir)/Python/module_names.h + $(srcdir)/Python/stdlib_module_names.h $(LIBRARY_OBJS) $(MODOBJS) Programs/python.o: $(PYTHON_HEADERS) diff --git a/Misc/NEWS.d/next/Library/2021-01-18-11-59-46.bpo-42955.CSWLC9.rst b/Misc/NEWS.d/next/Library/2021-01-18-11-59-46.bpo-42955.CSWLC9.rst index 0631acd7a98..373b829b0fb 100644 --- a/Misc/NEWS.d/next/Library/2021-01-18-11-59-46.bpo-42955.CSWLC9.rst +++ b/Misc/NEWS.d/next/Library/2021-01-18-11-59-46.bpo-42955.CSWLC9.rst @@ -1,2 +1,2 @@ -Add :data:`sys.module_names`, containing the list of the standard library +Add :data:`sys.stdlib_module_names`, containing the list of the standard library module names. Patch by Victor Stinner. diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 6a260da6555..f172f2a5786 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -291,7 +291,7 @@ - + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 98e3ca2c9e6..3bafdb8d297 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -360,7 +360,7 @@ Python - + Python diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index a97f45d0d5d..bf5dcdd107e 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2497,7 +2497,7 @@ fatal_error_exit(int status) // Dump the list of extension modules of sys.modules, excluding stdlib modules -// (sys.module_names), into fd file descriptor. +// (sys.stdlib_module_names), into fd file descriptor. // // This function is called by a signal handler in faulthandler: avoid memory // allocations and keep the implementation simple. For example, the list is not @@ -2519,19 +2519,19 @@ _Py_DumpExtensionModules(int fd, PyInterpreterState *interp) // Avoid PyDict_GetItemString() which calls PyUnicode_FromString(), // memory cannot be allocated on the heap in a signal handler. // Iterate on the dict instead. - PyObject *module_names = NULL; + PyObject *stdlib_module_names = NULL; pos = 0; while (PyDict_Next(interp->sysdict, &pos, &key, &value)) { if (PyUnicode_Check(key) - && PyUnicode_CompareWithASCIIString(key, "module_names") == 0) { - module_names = value; + && PyUnicode_CompareWithASCIIString(key, "stdlib_module_names") == 0) { + stdlib_module_names = value; break; } } - // If we failed to get sys.module_names or it's not a frozenset, + // If we failed to get sys.stdlib_module_names or it's not a frozenset, // don't exclude stdlib modules. - if (module_names != NULL && !PyFrozenSet_Check(module_names)) { - module_names = NULL; + if (stdlib_module_names != NULL && !PyFrozenSet_Check(stdlib_module_names)) { + stdlib_module_names = NULL; } // List extensions @@ -2547,13 +2547,13 @@ _Py_DumpExtensionModules(int fd, PyInterpreterState *interp) } // Use the module name from the sys.modules key, // don't attempt to get the module object name. - if (module_names != NULL) { + if (stdlib_module_names != NULL) { int is_stdlib_ext = 0; - Py_ssize_t i; + Py_ssize_t i = 0; PyObject *item; Py_hash_t hash; - for (i=0; _PySet_NextEntry(module_names, &i, &item, &hash); ) { + while (_PySet_NextEntry(stdlib_module_names, &i, &item, &hash)) { if (PyUnicode_Check(item) && PyUnicode_Compare(key, item) == 0) { diff --git a/Python/module_names.h b/Python/stdlib_module_names.h similarity index 95% rename from Python/module_names.h rename to Python/stdlib_module_names.h index 0dc2633916d..8c430821d64 100644 --- a/Python/module_names.h +++ b/Python/stdlib_module_names.h @@ -1,7 +1,7 @@ -// Auto-generated by Tools/scripts/generate_module_names.py. -// List used to create sys.module_names. +// Auto-generated by Tools/scripts/generate_stdlib_module_names.py. +// List used to create sys.stdlib_module_names. -static const char* _Py_module_names[] = { +static const char* _Py_stdlib_module_names[] = { "__future__", "_abc", "_aix_support", diff --git a/Python/sysmodule.c b/Python/sysmodule.c index e2f7e39f333..b9349effe3c 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -29,7 +29,7 @@ Data members: #include "frameobject.h" // PyFrame_GetBack() #include "pydtrace.h" #include "osdefs.h" // DELIM -#include "module_names.h" // _Py_module_names +#include "stdlib_module_names.h" // _Py_stdlib_module_names #include #ifdef MS_WINDOWS @@ -2054,16 +2054,16 @@ error: static PyObject * -list_module_names(void) +list_stdlib_module_names(void) { - Py_ssize_t len = Py_ARRAY_LENGTH(_Py_module_names); + Py_ssize_t len = Py_ARRAY_LENGTH(_Py_stdlib_module_names); PyObject *names = PyTuple_New(len); if (names == NULL) { return NULL; } for (Py_ssize_t i = 0; i < len; i++) { - PyObject *name = PyUnicode_FromString(_Py_module_names[i]); + PyObject *name = PyUnicode_FromString(_Py_stdlib_module_names[i]); if (name == NULL) { Py_DECREF(names); return NULL; @@ -2784,7 +2784,7 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) SET_SYS("hash_info", get_hash_info(tstate)); SET_SYS("maxunicode", PyLong_FromLong(0x10FFFF)); SET_SYS("builtin_module_names", list_builtin_module_names()); - SET_SYS("module_names", list_module_names()); + SET_SYS("stdlib_module_names", list_stdlib_module_names()); #if PY_BIG_ENDIAN SET_SYS_FROM_STRING("byteorder", "big"); #else diff --git a/Tools/scripts/generate_module_names.py b/Tools/scripts/generate_stdlib_module_names.py similarity index 92% rename from Tools/scripts/generate_module_names.py rename to Tools/scripts/generate_stdlib_module_names.py index 9d363aa04b3..02647691fc4 100644 --- a/Tools/scripts/generate_module_names.py +++ b/Tools/scripts/generate_stdlib_module_names.py @@ -1,5 +1,5 @@ # This script lists the names of standard library modules -# to update Python/module_names.h +# to update Python/stdlib_mod_names.h import os.path import re import subprocess @@ -126,10 +126,11 @@ def list_modules(): 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("// Auto-generated by Tools/scripts/generate_stdlib_module_names.py.", + file=fp) + print("// List used to create sys.stdlib_module_names.", file=fp) print(file=fp) - print("static const char* _Py_module_names[] = {", file=fp) + print("static const char* _Py_stdlib_module_names[] = {", file=fp) for name in sorted(names): print(f'"{name}",', file=fp) print("};", file=fp)