From 12f494a17016ba66c7f87fb79d915a64f526ebea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:33:14 +0200 Subject: [PATCH 01/28] remove `Py_BytesWarningFlag` --- Doc/c-api/init.rst | 14 -------------- Doc/deprecations/c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 1 - Programs/_testembed.c | 3 --- Python/initconfig.c | 4 ---- Tools/c-analyzer/cpython/ignored.tsv | 1 - 7 files changed, 27 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 52f64a61006b74..2a69095db99d58 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -97,20 +97,6 @@ When a flag is set by an option, the value of the flag is the number of times that the option was set. For example, ``-b`` sets :c:data:`Py_BytesWarningFlag` to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. -.. c:var:: int Py_BytesWarningFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.bytes_warning` should be used instead, see :ref:`Python - Initialization Configuration `. - - Issue a warning when comparing :class:`bytes` or :class:`bytearray` with - :class:`str` or :class:`bytes` with :class:`int`. Issue an error if greater - or equal to ``2``. - - Set by the :option:`-b` option. - - .. deprecated-removed:: 3.12 3.15 - .. c:var:: int Py_DebugFlag This API is kept for backward compatibility: setting diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index a5cc8f1d5b3475..b31ba4b6ba00a9 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -89,9 +89,6 @@ Pending removal in Python 3.15 * :c:var:`Py_NoSiteFlag`: Use :c:member:`PyConfig.site_import` or :c:func:`PyConfig_Get("site_import") ` instead. - * :c:var:`Py_BytesWarningFlag`: - Use :c:member:`PyConfig.bytes_warning` or - :c:func:`PyConfig_Get("bytes_warning") ` instead. * :c:var:`Py_FrozenFlag`: Use :c:member:`PyConfig.pathconfig_warnings` or :c:func:`PyConfig_Get("pathconfig_warnings") ` instead. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index f6ebd99ed7e2ff..3bb3d6f548c759 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -12,7 +12,6 @@ Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InspectFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_OptimizeFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoSiteFlag; -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_BytesWarningFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_FrozenFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_DontWriteBytecodeFlag; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 95b2d80464c349..4832c000cf43ce 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -700,7 +700,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): COPY_GLOBAL_CONFIG = [ # Copy core config to global config for expected values # True means that the core config value is inverted (0 => 1 and 1 => 0) - ('Py_BytesWarningFlag', 'bytes_warning'), ('Py_DebugFlag', 'parser_debug'), ('Py_DontWriteBytecodeFlag', 'write_bytecode', True), ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 8a7412c7019e60..e8ce33281a5ab9 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -574,7 +574,6 @@ static int test_init_global_config(void) /* Py_IsolatedFlag is not tested */ Py_NoSiteFlag = 1; - Py_BytesWarningFlag = 1; putenv("PYTHONINSPECT="); Py_InspectFlag = 1; @@ -710,7 +709,6 @@ static int test_init_from_config(void) Py_NoSiteFlag = 0; config.site_import = 0; - Py_BytesWarningFlag = 0; config.bytes_warning = 1; putenv("PYTHONINSPECT="); @@ -1054,7 +1052,6 @@ static void set_all_global_config_variables(void) { Py_IsolatedFlag = 0; Py_IgnoreEnvironmentFlag = 0; - Py_BytesWarningFlag = 2; Py_InspectFlag = 1; Py_InteractiveFlag = 1; Py_OptimizeFlag = 1; diff --git a/Python/initconfig.c b/Python/initconfig.c index e827091172162e..e5a9afa58f55e0 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -469,7 +469,6 @@ int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ int Py_InspectFlag = 0; /* Needed to determine whether to exit at SystemExit */ int Py_OptimizeFlag = 0; /* Needed by compile.c */ int Py_NoSiteFlag = 0; /* Suppress 'import site' */ -int Py_BytesWarningFlag = 0; /* Warn on str(bytes) and str(buffer) */ int Py_FrozenFlag = 0; /* Needed by getpath.c */ int Py_IgnoreEnvironmentFlag = 0; /* e.g. PYTHONPATH, PYTHONHOME */ int Py_DontWriteBytecodeFlag = 0; /* Suppress writing bytecode files (*.pyc) */ @@ -530,7 +529,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_OptimizeFlag); SET_ITEM_INT(Py_NoSiteFlag); - SET_ITEM_INT(Py_BytesWarningFlag); SET_ITEM_INT(Py_FrozenFlag); SET_ITEM_INT(Py_IgnoreEnvironmentFlag); SET_ITEM_INT(Py_DontWriteBytecodeFlag); @@ -1674,7 +1672,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(isolated, Py_IsolatedFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); - COPY_FLAG(bytes_warning, Py_BytesWarningFlag); COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); COPY_FLAG(optimization_level, Py_OptimizeFlag); @@ -1714,7 +1711,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(isolated, Py_IsolatedFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); - COPY_FLAG(bytes_warning, Py_BytesWarningFlag); COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); COPY_FLAG(optimization_level, Py_OptimizeFlag); diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index b128abca39fb41..c10932c011600a 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -116,7 +116,6 @@ Python/initconfig.c - Py_InteractiveFlag - Python/initconfig.c - Py_InspectFlag - Python/initconfig.c - Py_OptimizeFlag - Python/initconfig.c - Py_NoSiteFlag - -Python/initconfig.c - Py_BytesWarningFlag - Python/initconfig.c - Py_FrozenFlag - Python/initconfig.c - Py_IgnoreEnvironmentFlag - Python/initconfig.c - Py_DontWriteBytecodeFlag - From a6467f8f86ef3f54717e1be78fa508ec80d035fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:34:08 +0200 Subject: [PATCH 02/28] remove `Py_DebugFlag` --- Doc/c-api/init.rst | 13 ------------- Doc/deprecations/c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 1 - Programs/_testembed.c | 3 --- Python/initconfig.c | 4 ---- Tools/c-analyzer/cpython/ignored.tsv | 1 - 7 files changed, 26 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 2a69095db99d58..a1a85967644991 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -97,19 +97,6 @@ When a flag is set by an option, the value of the flag is the number of times that the option was set. For example, ``-b`` sets :c:data:`Py_BytesWarningFlag` to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. -.. c:var:: int Py_DebugFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.parser_debug` should be used instead, see :ref:`Python - Initialization Configuration `. - - Turn on parser debugging output (for expert only, depending on compilation - options). - - Set by the :option:`-d` option and the :envvar:`PYTHONDEBUG` environment - variable. - - .. deprecated-removed:: 3.12 3.15 .. c:var:: int Py_DontWriteBytecodeFlag diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index b31ba4b6ba00a9..6dc9d83777132a 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -68,9 +68,6 @@ Pending removal in Python 3.15 * Global configuration variables: - * :c:var:`Py_DebugFlag`: - Use :c:member:`PyConfig.parser_debug` or - :c:func:`PyConfig_Get("parser_debug") ` instead. * :c:var:`Py_VerboseFlag`: Use :c:member:`PyConfig.verbose` or :c:func:`PyConfig_Get("verbose") ` instead. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 3bb3d6f548c759..f14f595239c448 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -5,7 +5,6 @@ extern "C" { #endif -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_DebugFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_VerboseFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_QuietFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 4832c000cf43ce..0f602b56392b23 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -700,7 +700,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): COPY_GLOBAL_CONFIG = [ # Copy core config to global config for expected values # True means that the core config value is inverted (0 => 1 and 1 => 0) - ('Py_DebugFlag', 'parser_debug'), ('Py_DontWriteBytecodeFlag', 'write_bytecode', True), ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), diff --git a/Programs/_testembed.c b/Programs/_testembed.c index e8ce33281a5ab9..f1016ecce05089 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -584,8 +584,6 @@ static int test_init_global_config(void) putenv("PYTHONDEBUG=0"); Py_OptimizeFlag = 2; - /* Py_DebugFlag is not tested */ - putenv("PYTHONDONTWRITEBYTECODE="); Py_DontWriteBytecodeFlag = 1; @@ -1055,7 +1053,6 @@ static void set_all_global_config_variables(void) Py_InspectFlag = 1; Py_InteractiveFlag = 1; Py_OptimizeFlag = 1; - Py_DebugFlag = 1; Py_VerboseFlag = 1; Py_QuietFlag = 1; Py_FrozenFlag = 0; diff --git a/Python/initconfig.c b/Python/initconfig.c index e5a9afa58f55e0..7d082496a87007 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -462,7 +462,6 @@ static const char usage_envvars[] = /* UTF-8 mode (PEP 540): if equals to 1, use the UTF-8 encoding, and change stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; -int Py_DebugFlag = 0; /* Needed by parser.c */ int Py_VerboseFlag = 0; /* Needed by import.c */ int Py_QuietFlag = 0; /* Needed by sysmodule.c */ int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ @@ -521,7 +520,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(_Py_HasFileSystemDefaultEncodeErrors); SET_ITEM_INT(Py_UTF8Mode); - SET_ITEM_INT(Py_DebugFlag); SET_ITEM_INT(Py_VerboseFlag); SET_ITEM_INT(Py_QuietFlag); SET_ITEM_INT(Py_InteractiveFlag); @@ -1675,7 +1673,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); COPY_FLAG(optimization_level, Py_OptimizeFlag); - COPY_FLAG(parser_debug, Py_DebugFlag); COPY_FLAG(verbose, Py_VerboseFlag); COPY_FLAG(quiet, Py_QuietFlag); #ifdef MS_WINDOWS @@ -1714,7 +1711,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); COPY_FLAG(optimization_level, Py_OptimizeFlag); - COPY_FLAG(parser_debug, Py_DebugFlag); COPY_FLAG(verbose, Py_VerboseFlag); COPY_FLAG(quiet, Py_QuietFlag); #ifdef MS_WINDOWS diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index c10932c011600a..57726280cb3c3f 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -109,7 +109,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - -Python/initconfig.c - Py_DebugFlag - Python/initconfig.c - Py_VerboseFlag - Python/initconfig.c - Py_QuietFlag - Python/initconfig.c - Py_InteractiveFlag - From df48806208b2e8948ffbfe15df6e75e709ef121e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:35:17 +0200 Subject: [PATCH 03/28] remove `Py_VerboseFlag` --- Doc/c-api/init.rst | 16 ---------------- .../c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 1 - Programs/_testembed.c | 3 --- Python/initconfig.c | 4 ---- Tools/c-analyzer/cpython/ignored.tsv | 1 - 7 files changed, 29 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index a1a85967644991..523bf70cecad25 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -297,22 +297,6 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. deprecated-removed:: 3.12 3.15 -.. c:var:: int Py_VerboseFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.verbose` should be used instead, see :ref:`Python - Initialization Configuration `. - - Print a message each time a module is initialized, showing the place - (filename or built-in module) from which it is loaded. If greater or equal - to ``2``, print a message for each file that is checked for when - searching for a module. Also provides information on module cleanup at exit. - - Set by the :option:`-v` option and the :envvar:`PYTHONVERBOSE` environment - variable. - - .. deprecated-removed:: 3.12 3.15 - Initializing and finalizing the interpreter =========================================== diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index 6dc9d83777132a..7770a6f41086d4 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -68,9 +68,6 @@ Pending removal in Python 3.15 * Global configuration variables: - * :c:var:`Py_VerboseFlag`: - Use :c:member:`PyConfig.verbose` or - :c:func:`PyConfig_Get("verbose") ` instead. * :c:var:`Py_QuietFlag`: Use :c:member:`PyConfig.quiet` or :c:func:`PyConfig_Get("quiet") ` instead. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index f14f595239c448..487aba7dca8ebd 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -5,7 +5,6 @@ extern "C" { #endif -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_VerboseFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_QuietFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InspectFlag; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 0f602b56392b23..0aaa4dfa76920b 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -713,7 +713,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_OptimizeFlag', 'optimization_level'), ('Py_QuietFlag', 'quiet'), ('Py_UnbufferedStdioFlag', 'buffered_stdio', True), - ('Py_VerboseFlag', 'verbose'), ] if MS_WINDOWS: COPY_GLOBAL_PRE_CONFIG.extend(( diff --git a/Programs/_testembed.c b/Programs/_testembed.c index f1016ecce05089..130672bd89f8cd 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -588,7 +588,6 @@ static int test_init_global_config(void) Py_DontWriteBytecodeFlag = 1; putenv("PYTHONVERBOSE=0"); - Py_VerboseFlag = 1; Py_QuietFlag = 1; Py_NoUserSiteDirectory = 1; @@ -701,7 +700,6 @@ static int test_init_from_config(void) config_set_string(&config, &config.platlibdir, L"my_platlibdir"); putenv("PYTHONVERBOSE=0"); - Py_VerboseFlag = 0; config.verbose = 1; Py_NoSiteFlag = 0; @@ -1053,7 +1051,6 @@ static void set_all_global_config_variables(void) Py_InspectFlag = 1; Py_InteractiveFlag = 1; Py_OptimizeFlag = 1; - Py_VerboseFlag = 1; Py_QuietFlag = 1; Py_FrozenFlag = 0; Py_UnbufferedStdioFlag = 1; diff --git a/Python/initconfig.c b/Python/initconfig.c index 7d082496a87007..e91b52f6b90669 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -462,7 +462,6 @@ static const char usage_envvars[] = /* UTF-8 mode (PEP 540): if equals to 1, use the UTF-8 encoding, and change stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; -int Py_VerboseFlag = 0; /* Needed by import.c */ int Py_QuietFlag = 0; /* Needed by sysmodule.c */ int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ int Py_InspectFlag = 0; /* Needed to determine whether to exit at SystemExit */ @@ -520,7 +519,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(_Py_HasFileSystemDefaultEncodeErrors); SET_ITEM_INT(Py_UTF8Mode); - SET_ITEM_INT(Py_VerboseFlag); SET_ITEM_INT(Py_QuietFlag); SET_ITEM_INT(Py_InteractiveFlag); SET_ITEM_INT(Py_InspectFlag); @@ -1673,7 +1671,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); COPY_FLAG(optimization_level, Py_OptimizeFlag); - COPY_FLAG(verbose, Py_VerboseFlag); COPY_FLAG(quiet, Py_QuietFlag); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); @@ -1711,7 +1708,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); COPY_FLAG(optimization_level, Py_OptimizeFlag); - COPY_FLAG(verbose, Py_VerboseFlag); COPY_FLAG(quiet, Py_QuietFlag); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 57726280cb3c3f..1ec0db50086535 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -109,7 +109,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - -Python/initconfig.c - Py_VerboseFlag - Python/initconfig.c - Py_QuietFlag - Python/initconfig.c - Py_InteractiveFlag - Python/initconfig.c - Py_InspectFlag - From cfabb228408004fe68416664ddc5465065625dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:35:55 +0200 Subject: [PATCH 04/28] remove `Py_QuietFlag` --- Doc/c-api/init.rst | 13 ------------- Doc/deprecations/c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 1 - Programs/_testembed.c | 3 --- Python/initconfig.c | 4 ---- Tools/c-analyzer/cpython/ignored.tsv | 1 - 7 files changed, 26 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 523bf70cecad25..013183dcf8b681 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -270,19 +270,6 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. deprecated-removed:: 3.12 3.15 -.. c:var:: int Py_QuietFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.quiet` should be used instead, see :ref:`Python - Initialization Configuration `. - - Don't display the copyright and version messages even in interactive mode. - - Set by the :option:`-q` option. - - .. versionadded:: 3.2 - - .. deprecated-removed:: 3.12 3.15 .. c:var:: int Py_UnbufferedStdioFlag diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index 7770a6f41086d4..b6a6c93c57309e 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -68,9 +68,6 @@ Pending removal in Python 3.15 * Global configuration variables: - * :c:var:`Py_QuietFlag`: - Use :c:member:`PyConfig.quiet` or - :c:func:`PyConfig_Get("quiet") ` instead. * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 487aba7dca8ebd..01201351843d23 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -5,7 +5,6 @@ extern "C" { #endif -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_QuietFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InspectFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_OptimizeFlag; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 0aaa4dfa76920b..ff2fa004db1d3c 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -711,7 +711,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_NoSiteFlag', 'site_import', True), ('Py_NoUserSiteDirectory', 'user_site_directory', True), ('Py_OptimizeFlag', 'optimization_level'), - ('Py_QuietFlag', 'quiet'), ('Py_UnbufferedStdioFlag', 'buffered_stdio', True), ] if MS_WINDOWS: diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 130672bd89f8cd..12dcd004427576 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -589,7 +589,6 @@ static int test_init_global_config(void) putenv("PYTHONVERBOSE=0"); - Py_QuietFlag = 1; Py_NoUserSiteDirectory = 1; putenv("PYTHONUNBUFFERED="); @@ -724,7 +723,6 @@ static int test_init_from_config(void) Py_DontWriteBytecodeFlag = 0; config.write_bytecode = 0; - Py_QuietFlag = 0; config.quiet = 1; config.configure_c_stdio = 1; @@ -1051,7 +1049,6 @@ static void set_all_global_config_variables(void) Py_InspectFlag = 1; Py_InteractiveFlag = 1; Py_OptimizeFlag = 1; - Py_QuietFlag = 1; Py_FrozenFlag = 0; Py_UnbufferedStdioFlag = 1; Py_NoSiteFlag = 1; diff --git a/Python/initconfig.c b/Python/initconfig.c index e91b52f6b90669..223b070ea3255c 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -462,7 +462,6 @@ static const char usage_envvars[] = /* UTF-8 mode (PEP 540): if equals to 1, use the UTF-8 encoding, and change stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; -int Py_QuietFlag = 0; /* Needed by sysmodule.c */ int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ int Py_InspectFlag = 0; /* Needed to determine whether to exit at SystemExit */ int Py_OptimizeFlag = 0; /* Needed by compile.c */ @@ -519,7 +518,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(_Py_HasFileSystemDefaultEncodeErrors); SET_ITEM_INT(Py_UTF8Mode); - SET_ITEM_INT(Py_QuietFlag); SET_ITEM_INT(Py_InteractiveFlag); SET_ITEM_INT(Py_InspectFlag); @@ -1671,7 +1669,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); COPY_FLAG(optimization_level, Py_OptimizeFlag); - COPY_FLAG(quiet, Py_QuietFlag); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif @@ -1708,7 +1705,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); COPY_FLAG(optimization_level, Py_OptimizeFlag); - COPY_FLAG(quiet, Py_QuietFlag); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 1ec0db50086535..16341641aee2d4 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -109,7 +109,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - -Python/initconfig.c - Py_QuietFlag - Python/initconfig.c - Py_InteractiveFlag - Python/initconfig.c - Py_InspectFlag - Python/initconfig.c - Py_OptimizeFlag - From 71bca31c824e0e881b36713aac50337c9acd3f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:38:26 +0200 Subject: [PATCH 05/28] remove `Py_InspectFlag` --- Doc/c-api/init.rst | 23 ++++--------------- .../c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 1 - Modules/main.c | 4 ---- Programs/_testembed.c | 3 --- Python/initconfig.c | 6 +---- Tools/c-analyzer/cpython/ignored.tsv | 1 - 8 files changed, 6 insertions(+), 36 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 013183dcf8b681..0492992650037e 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -153,20 +153,6 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. deprecated-removed:: 3.12 3.15 -.. c:var:: int Py_InspectFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.inspect` should be used instead, see - :ref:`Python Initialization Configuration `. - - When a script is passed as first argument or the :option:`-c` option is used, - enter interactive mode after executing the script or the command, even when - :data:`sys.stdin` does not appear to be a terminal. - - Set by the :option:`-i` option and the :envvar:`PYTHONINSPECT` environment - variable. - - .. deprecated-removed:: 3.12 3.15 .. c:var:: int Py_InteractiveFlag @@ -449,10 +435,11 @@ Initializing and finalizing the interpreter Note that if an otherwise unhandled :exc:`SystemExit` is raised, this function will not return ``1``, but exit the process, as long as - ``Py_InspectFlag`` is not set. If ``Py_InspectFlag`` is set, execution will - drop into the interactive Python prompt, at which point a second otherwise - unhandled :exc:`SystemExit` will still exit the process, while any other - means of exiting will set the return value as described above. + :c:member:`PyConfig.inspect` is not set. If :c:member:`!PyConfig.inspect` + is set, execution will drop into the interactive Python prompt, at which + point a second otherwise unhandled :exc:`SystemExit` will still exit the + process, while any other means of exiting will set the return value as + described above. In terms of the CPython runtime configuration APIs documented in the :ref:`runtime configuration ` section (and without accounting diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index b6a6c93c57309e..7f216553134397 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`Py_InspectFlag`: - Use :c:member:`PyConfig.inspect` or - :c:func:`PyConfig_Get("inspect") ` instead. * :c:var:`Py_OptimizeFlag`: Use :c:member:`PyConfig.optimization_level` or :c:func:`PyConfig_Get("optimization_level") ` instead. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 01201351843d23..9b33200594e109 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -6,7 +6,6 @@ extern "C" { #endif Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InspectFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_OptimizeFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoSiteFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_FrozenFlag; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index ff2fa004db1d3c..6cc7c0d21f6049 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -705,7 +705,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), ('Py_FrozenFlag', 'pathconfig_warnings', True), ('Py_IgnoreEnvironmentFlag', 'use_environment', True), - ('Py_InspectFlag', 'inspect'), ('Py_InteractiveFlag', 'interactive'), ('Py_IsolatedFlag', 'isolated'), ('Py_NoSiteFlag', 'site_import', True), diff --git a/Modules/main.c b/Modules/main.c index ea1239ecc57f00..12671085732937 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -523,10 +523,6 @@ static void pymain_set_inspect(PyConfig *config, int inspect) { config->inspect = inspect; -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - Py_InspectFlag = inspect; -_Py_COMP_DIAG_POP } diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 12dcd004427576..83ea78973201c7 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -576,7 +576,6 @@ static int test_init_global_config(void) Py_NoSiteFlag = 1; putenv("PYTHONINSPECT="); - Py_InspectFlag = 1; putenv("PYTHONOPTIMIZE=0"); Py_InteractiveFlag = 1; @@ -707,7 +706,6 @@ static int test_init_from_config(void) config.bytes_warning = 1; putenv("PYTHONINSPECT="); - Py_InspectFlag = 0; config.inspect = 1; Py_InteractiveFlag = 0; @@ -1046,7 +1044,6 @@ static void set_all_global_config_variables(void) { Py_IsolatedFlag = 0; Py_IgnoreEnvironmentFlag = 0; - Py_InspectFlag = 1; Py_InteractiveFlag = 1; Py_OptimizeFlag = 1; Py_FrozenFlag = 0; diff --git a/Python/initconfig.c b/Python/initconfig.c index 223b070ea3255c..4b103df0195d5f 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -463,7 +463,6 @@ static const char usage_envvars[] = stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ -int Py_InspectFlag = 0; /* Needed to determine whether to exit at SystemExit */ int Py_OptimizeFlag = 0; /* Needed by compile.c */ int Py_NoSiteFlag = 0; /* Suppress 'import site' */ int Py_FrozenFlag = 0; /* Needed by getpath.c */ @@ -519,7 +518,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_UTF8Mode); SET_ITEM_INT(Py_InteractiveFlag); - SET_ITEM_INT(Py_InspectFlag); SET_ITEM_INT(Py_OptimizeFlag); SET_ITEM_INT(Py_NoSiteFlag); @@ -1012,7 +1010,7 @@ _PyConfig_InitCompatConfig(PyConfig *config) config->site_import = -1; config->bytes_warning = -1; config->warn_default_encoding = 0; - config->inspect = -1; + config->inspect = 0; config->interactive = -1; config->optimization_level = -1; config->parser_debug= -1; @@ -1666,7 +1664,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(isolated, Py_IsolatedFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); - COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); COPY_FLAG(optimization_level, Py_OptimizeFlag); #ifdef MS_WINDOWS @@ -1702,7 +1699,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(isolated, Py_IsolatedFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); - COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); COPY_FLAG(optimization_level, Py_OptimizeFlag); #ifdef MS_WINDOWS diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 16341641aee2d4..74035aff83323b 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -110,7 +110,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - Python/initconfig.c - Py_InteractiveFlag - -Python/initconfig.c - Py_InspectFlag - Python/initconfig.c - Py_OptimizeFlag - Python/initconfig.c - Py_NoSiteFlag - Python/initconfig.c - Py_FrozenFlag - From 7ebf7bd466d993560dc65bf6aed70786b9f9aae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:40:42 +0200 Subject: [PATCH 06/28] remove `Py_OptimizeFlag` --- Doc/c-api/init.rst | 11 ----------- .../c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/pydebug.h | 1 - Lib/test/test_ctypes/test_values.py | 7 ------- Lib/test/test_embed.py | 1 - Lib/test/test_utf8_mode.py | 2 +- Programs/_testembed.c | 3 --- Python/initconfig.c | 16 ++++++---------- Tools/c-analyzer/cpython/ignored.tsv | 1 - Tools/freeze/makefreeze.py | 5 ++--- 10 files changed, 9 insertions(+), 41 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 0492992650037e..212d6e37daafed 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -245,17 +245,6 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. deprecated-removed:: 3.12 3.15 -.. c:var:: int Py_OptimizeFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.optimization_level` should be used instead, see - :ref:`Python Initialization Configuration `. - - Set by the :option:`-O` option and the :envvar:`PYTHONOPTIMIZE` environment - variable. - - .. deprecated-removed:: 3.12 3.15 - .. c:var:: int Py_UnbufferedStdioFlag diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index 7f216553134397..6e012b65c0cac9 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`Py_OptimizeFlag`: - Use :c:member:`PyConfig.optimization_level` or - :c:func:`PyConfig_Get("optimization_level") ` instead. * :c:var:`Py_NoSiteFlag`: Use :c:member:`PyConfig.site_import` or :c:func:`PyConfig_Get("site_import") ` instead. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 9b33200594e109..3c530576142fbb 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -6,7 +6,6 @@ extern "C" { #endif Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_OptimizeFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoSiteFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_FrozenFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; diff --git a/Lib/test/test_ctypes/test_values.py b/Lib/test/test_ctypes/test_values.py index 8d1ee25ace5479..e0bf2e66d0a8f2 100644 --- a/Lib/test/test_ctypes/test_values.py +++ b/Lib/test/test_ctypes/test_values.py @@ -39,13 +39,6 @@ def test_undefined(self): class PythonValuesTestCase(unittest.TestCase): """This test only works when python itself is a dll/shared library""" - def test_optimizeflag(self): - # This test accesses the Py_OptimizeFlag integer, which is - # exported by the Python dll and should match the sys.flags value - - opt = c_int.in_dll(pythonapi, "Py_OptimizeFlag").value - self.assertEqual(opt, sys.flags.optimize) - @thread_unsafe('overrides frozen modules') def test_frozentable(self): # Python exports a PyImport_FrozenModules symbol. This is a diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 6cc7c0d21f6049..9acf9426499943 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -709,7 +709,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_IsolatedFlag', 'isolated'), ('Py_NoSiteFlag', 'site_import', True), ('Py_NoUserSiteDirectory', 'user_site_directory', True), - ('Py_OptimizeFlag', 'optimization_level'), ('Py_UnbufferedStdioFlag', 'buffered_stdio', True), ] if MS_WINDOWS: diff --git a/Lib/test/test_utf8_mode.py b/Lib/test/test_utf8_mode.py index f66881044e16df..bcbf641fc612c3 100644 --- a/Lib/test/test_utf8_mode.py +++ b/Lib/test/test_utf8_mode.py @@ -237,7 +237,7 @@ def check(utf8_opt, expected, **kw): check('utf8=0', [c_arg], LC_ALL=loc) def test_optim_level(self): - # CPython: check that Py_Main() doesn't increment Py_OptimizeFlag + # CPython: check that Py_Main() doesn't increment PyConfig.optimize # twice when -X utf8 requires to parse the configuration twice (when # the encoding changes after reading the configuration, the # configuration is read again with the new encoding). diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 83ea78973201c7..033ca84f166f8a 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -581,7 +581,6 @@ static int test_init_global_config(void) Py_InteractiveFlag = 1; putenv("PYTHONDEBUG=0"); - Py_OptimizeFlag = 2; putenv("PYTHONDONTWRITEBYTECODE="); Py_DontWriteBytecodeFlag = 1; @@ -712,7 +711,6 @@ static int test_init_from_config(void) config.interactive = 1; putenv("PYTHONOPTIMIZE=0"); - Py_OptimizeFlag = 1; config.optimization_level = 2; /* FIXME: test parser_debug */ @@ -1045,7 +1043,6 @@ static void set_all_global_config_variables(void) Py_IsolatedFlag = 0; Py_IgnoreEnvironmentFlag = 0; Py_InteractiveFlag = 1; - Py_OptimizeFlag = 1; Py_FrozenFlag = 0; Py_UnbufferedStdioFlag = 1; Py_NoSiteFlag = 1; diff --git a/Python/initconfig.c b/Python/initconfig.c index 4b103df0195d5f..8241801aa46124 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -463,7 +463,6 @@ static const char usage_envvars[] = stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ -int Py_OptimizeFlag = 0; /* Needed by compile.c */ int Py_NoSiteFlag = 0; /* Suppress 'import site' */ int Py_FrozenFlag = 0; /* Needed by getpath.c */ int Py_IgnoreEnvironmentFlag = 0; /* e.g. PYTHONPATH, PYTHONHOME */ @@ -519,7 +518,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_UTF8Mode); SET_ITEM_INT(Py_InteractiveFlag); - SET_ITEM_INT(Py_OptimizeFlag); SET_ITEM_INT(Py_NoSiteFlag); SET_ITEM_INT(Py_FrozenFlag); SET_ITEM_INT(Py_IgnoreEnvironmentFlag); @@ -1012,12 +1010,12 @@ _PyConfig_InitCompatConfig(PyConfig *config) config->warn_default_encoding = 0; config->inspect = 0; config->interactive = -1; - config->optimization_level = -1; - config->parser_debug= -1; - config->write_bytecode = -1; - config->verbose = -1; - config->quiet = -1; - config->user_site_directory = -1; + config->optimization_level = 0; + config->parser_debug = 0; + config->write_bytecode = 1; + config->verbose = 0; + config->quiet = 0; + config->user_site_directory = 1; config->configure_c_stdio = 0; config->buffered_stdio = -1; config->_install_importlib = 1; @@ -1665,7 +1663,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(isolated, Py_IsolatedFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); COPY_FLAG(interactive, Py_InteractiveFlag); - COPY_FLAG(optimization_level, Py_OptimizeFlag); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif @@ -1700,7 +1697,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(isolated, Py_IsolatedFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); COPY_FLAG(interactive, Py_InteractiveFlag); - COPY_FLAG(optimization_level, Py_OptimizeFlag); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 74035aff83323b..928bdf50065131 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -110,7 +110,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - Python/initconfig.c - Py_InteractiveFlag - -Python/initconfig.c - Py_OptimizeFlag - Python/initconfig.c - Py_NoSiteFlag - Python/initconfig.c - Py_FrozenFlag - Python/initconfig.c - Py_IgnoreEnvironmentFlag - diff --git a/Tools/freeze/makefreeze.py b/Tools/freeze/makefreeze.py index c464f4bbb2655d..ba5734b950a974 100644 --- a/Tools/freeze/makefreeze.py +++ b/Tools/freeze/makefreeze.py @@ -14,19 +14,18 @@ }; """ -# if __debug__ == 0 (i.e. -O option given), set Py_OptimizeFlag in frozen app. +# if __debug__ == 0 (i.e. -O option given), set PyConfig.optimize in frozen app. default_entry_point = """ int main(int argc, char **argv) { extern int Py_FrozenMain(int, char **); """ + ((not __debug__ and """ - Py_OptimizeFlag++; + putenv("PYTHONOPTIMIZE", "1"); """) or "") + """ PyImport_FrozenModules = _PyImport_FrozenModules; return Py_FrozenMain(argc, argv); } - """ def makefreeze(base, dict, debug=0, entry_point=None, fail_import=()): From 2d05afe159f907063df59f312505882df95669ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:41:34 +0200 Subject: [PATCH 07/28] remove `Py_NoSiteFlag` --- Doc/c-api/init.rst | 14 -------------- Doc/deprecations/c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 1 - Programs/_testembed.c | 6 ------ Python/initconfig.c | 8 ++------ Tools/c-analyzer/cpython/ignored.tsv | 1 - 7 files changed, 2 insertions(+), 32 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 212d6e37daafed..800226e9012ed8 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -216,20 +216,6 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. deprecated-removed:: 3.12 3.15 -.. c:var:: int Py_NoSiteFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.site_import` should be used instead, see - :ref:`Python Initialization Configuration `. - - Disable the import of the module :mod:`site` and the site-dependent - manipulations of :data:`sys.path` that it entails. Also disable these - manipulations if :mod:`site` is explicitly imported later (call - :func:`site.main` if you want them to be triggered). - - Set by the :option:`-S` option. - - .. deprecated-removed:: 3.12 3.15 .. c:var:: int Py_NoUserSiteDirectory diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index 6e012b65c0cac9..f7fdfd10684214 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`Py_NoSiteFlag`: - Use :c:member:`PyConfig.site_import` or - :c:func:`PyConfig_Get("site_import") ` instead. * :c:var:`Py_FrozenFlag`: Use :c:member:`PyConfig.pathconfig_warnings` or :c:func:`PyConfig_Get("pathconfig_warnings") ` instead. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 3c530576142fbb..6422971939768d 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -6,7 +6,6 @@ extern "C" { #endif Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoSiteFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_FrozenFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_DontWriteBytecodeFlag; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 9acf9426499943..d224ffc477b9ee 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -707,7 +707,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_IgnoreEnvironmentFlag', 'use_environment', True), ('Py_InteractiveFlag', 'interactive'), ('Py_IsolatedFlag', 'isolated'), - ('Py_NoSiteFlag', 'site_import', True), ('Py_NoUserSiteDirectory', 'user_site_directory', True), ('Py_UnbufferedStdioFlag', 'buffered_stdio', True), ] diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 033ca84f166f8a..6fcda1abce8fcf 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -572,9 +572,6 @@ static int test_init_global_config(void) /* Test initialization from global configuration variables (Py_xxx) */ Py_SetProgramName(L"./globalvar"); - /* Py_IsolatedFlag is not tested */ - Py_NoSiteFlag = 1; - putenv("PYTHONINSPECT="); putenv("PYTHONOPTIMIZE=0"); @@ -699,7 +696,6 @@ static int test_init_from_config(void) putenv("PYTHONVERBOSE=0"); config.verbose = 1; - Py_NoSiteFlag = 0; config.site_import = 0; config.bytes_warning = 1; @@ -1045,7 +1041,6 @@ static void set_all_global_config_variables(void) Py_InteractiveFlag = 1; Py_FrozenFlag = 0; Py_UnbufferedStdioFlag = 1; - Py_NoSiteFlag = 1; Py_DontWriteBytecodeFlag = 1; Py_NoUserSiteDirectory = 1; #ifdef MS_WINDOWS @@ -1115,7 +1110,6 @@ static int check_init_python_config(int preinit) Py_IgnoreEnvironmentFlag = 1; Py_FrozenFlag = 1; Py_UnbufferedStdioFlag = 1; - Py_NoSiteFlag = 1; Py_DontWriteBytecodeFlag = 1; Py_NoUserSiteDirectory = 1; #ifdef MS_WINDOWS diff --git a/Python/initconfig.c b/Python/initconfig.c index 8241801aa46124..9afae000b08e37 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -463,7 +463,6 @@ static const char usage_envvars[] = stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ -int Py_NoSiteFlag = 0; /* Suppress 'import site' */ int Py_FrozenFlag = 0; /* Needed by getpath.c */ int Py_IgnoreEnvironmentFlag = 0; /* e.g. PYTHONPATH, PYTHONHOME */ int Py_DontWriteBytecodeFlag = 0; /* Suppress writing bytecode files (*.pyc) */ @@ -518,7 +517,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_UTF8Mode); SET_ITEM_INT(Py_InteractiveFlag); - SET_ITEM_INT(Py_NoSiteFlag); SET_ITEM_INT(Py_FrozenFlag); SET_ITEM_INT(Py_IgnoreEnvironmentFlag); SET_ITEM_INT(Py_DontWriteBytecodeFlag); @@ -1005,8 +1003,8 @@ _PyConfig_InitCompatConfig(PyConfig *config) config->remote_debug = -1; config->module_search_paths_set = 0; config->parse_argv = 0; - config->site_import = -1; - config->bytes_warning = -1; + config->site_import = 1; + config->bytes_warning = 0; config->warn_default_encoding = 0; config->inspect = 0; config->interactive = -1; @@ -1669,7 +1667,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_NOT_FLAG(pathconfig_warnings, Py_FrozenFlag); COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); - COPY_NOT_FLAG(site_import, Py_NoSiteFlag); COPY_NOT_FLAG(write_bytecode, Py_DontWriteBytecodeFlag); COPY_NOT_FLAG(user_site_directory, Py_NoUserSiteDirectory); @@ -1703,7 +1700,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_NOT_FLAG(pathconfig_warnings, Py_FrozenFlag); COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); - COPY_NOT_FLAG(site_import, Py_NoSiteFlag); COPY_NOT_FLAG(write_bytecode, Py_DontWriteBytecodeFlag); COPY_NOT_FLAG(user_site_directory, Py_NoUserSiteDirectory); diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 928bdf50065131..4f499178d2f3e3 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -110,7 +110,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - Python/initconfig.c - Py_InteractiveFlag - -Python/initconfig.c - Py_NoSiteFlag - Python/initconfig.c - Py_FrozenFlag - Python/initconfig.c - Py_IgnoreEnvironmentFlag - Python/initconfig.c - Py_DontWriteBytecodeFlag - From 2a8e54678e2b21b199f7364605be4ae66ccd79cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:42:17 +0200 Subject: [PATCH 08/28] remove `Py_FrozenFlag` --- Doc/c-api/init.rst | 12 ------------ Doc/deprecations/c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 1 - Programs/_testembed.c | 5 ----- Python/initconfig.c | 6 +----- Tools/c-analyzer/cpython/ignored.tsv | 1 - 7 files changed, 1 insertion(+), 28 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 800226e9012ed8..0437eb6b335481 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -112,18 +112,6 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. deprecated-removed:: 3.12 3.15 -.. c:var:: int Py_FrozenFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.pathconfig_warnings` should be used instead, see - :ref:`Python Initialization Configuration `. - - Suppress error messages when calculating the module search path in - :c:func:`Py_GetPath`. - - Private flag used by ``_freeze_module`` and ``frozenmain`` programs. - - .. deprecated-removed:: 3.12 3.15 .. c:var:: int Py_HashRandomizationFlag diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index f7fdfd10684214..34ad67d4e1ed2e 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`Py_FrozenFlag`: - Use :c:member:`PyConfig.pathconfig_warnings` or - :c:func:`PyConfig_Get("pathconfig_warnings") ` instead. * :c:var:`Py_IgnoreEnvironmentFlag`: Use :c:member:`PyConfig.use_environment` or :c:func:`PyConfig_Get("use_environment") ` instead. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 6422971939768d..c2e65317e7f828 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -6,7 +6,6 @@ extern "C" { #endif Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_FrozenFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_DontWriteBytecodeFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoUserSiteDirectory; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index d224ffc477b9ee..f06a51de262e00 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -703,7 +703,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_DontWriteBytecodeFlag', 'write_bytecode', True), ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), - ('Py_FrozenFlag', 'pathconfig_warnings', True), ('Py_IgnoreEnvironmentFlag', 'use_environment', True), ('Py_InteractiveFlag', 'interactive'), ('Py_IsolatedFlag', 'isolated'), diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 6fcda1abce8fcf..d795b900ed7862 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -589,8 +589,6 @@ static int test_init_global_config(void) putenv("PYTHONUNBUFFERED="); Py_UnbufferedStdioFlag = 1; - Py_FrozenFlag = 1; - /* FIXME: test Py_LegacyWindowsFSEncodingFlag */ /* FIXME: test Py_LegacyWindowsStdioFlag */ @@ -733,7 +731,6 @@ static int test_init_from_config(void) config_set_string(&config, &config.check_hash_pycs_mode, L"always"); - Py_FrozenFlag = 0; config.pathconfig_warnings = 0; config.safe_path = 1; @@ -1039,7 +1036,6 @@ static void set_all_global_config_variables(void) Py_IsolatedFlag = 0; Py_IgnoreEnvironmentFlag = 0; Py_InteractiveFlag = 1; - Py_FrozenFlag = 0; Py_UnbufferedStdioFlag = 1; Py_DontWriteBytecodeFlag = 1; Py_NoUserSiteDirectory = 1; @@ -1108,7 +1104,6 @@ static int check_init_python_config(int preinit) set_all_global_config_variables(); Py_IsolatedFlag = 1; Py_IgnoreEnvironmentFlag = 1; - Py_FrozenFlag = 1; Py_UnbufferedStdioFlag = 1; Py_DontWriteBytecodeFlag = 1; Py_NoUserSiteDirectory = 1; diff --git a/Python/initconfig.c b/Python/initconfig.c index 9afae000b08e37..596d88f0751144 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -463,7 +463,6 @@ static const char usage_envvars[] = stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ -int Py_FrozenFlag = 0; /* Needed by getpath.c */ int Py_IgnoreEnvironmentFlag = 0; /* e.g. PYTHONPATH, PYTHONHOME */ int Py_DontWriteBytecodeFlag = 0; /* Suppress writing bytecode files (*.pyc) */ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ @@ -517,7 +516,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_UTF8Mode); SET_ITEM_INT(Py_InteractiveFlag); - SET_ITEM_INT(Py_FrozenFlag); SET_ITEM_INT(Py_IgnoreEnvironmentFlag); SET_ITEM_INT(Py_DontWriteBytecodeFlag); SET_ITEM_INT(Py_NoUserSiteDirectory); @@ -1018,7 +1016,7 @@ _PyConfig_InitCompatConfig(PyConfig *config) config->buffered_stdio = -1; config->_install_importlib = 1; config->check_hash_pycs_mode = NULL; - config->pathconfig_warnings = -1; + config->pathconfig_warnings = 1; config->_init_main = 1; #ifdef MS_WINDOWS config->legacy_windows_stdio = -1; @@ -1664,7 +1662,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif - COPY_NOT_FLAG(pathconfig_warnings, Py_FrozenFlag); COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); COPY_NOT_FLAG(write_bytecode, Py_DontWriteBytecodeFlag); @@ -1697,7 +1694,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif - COPY_NOT_FLAG(pathconfig_warnings, Py_FrozenFlag); COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); COPY_NOT_FLAG(write_bytecode, Py_DontWriteBytecodeFlag); diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 4f499178d2f3e3..8a1489fc5e6231 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -110,7 +110,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - Python/initconfig.c - Py_InteractiveFlag - -Python/initconfig.c - Py_FrozenFlag - Python/initconfig.c - Py_IgnoreEnvironmentFlag - Python/initconfig.c - Py_DontWriteBytecodeFlag - Python/initconfig.c - Py_NoUserSiteDirectory - From 93eee09d4c4cc9c0d80a7d6a31177c7cfb0ff449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:47:09 +0200 Subject: [PATCH 09/28] remove `Py_IgnoreEnvironmentFlag` --- Doc/c-api/init.rst | 13 ---------- .../c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/initconfig.h | 3 +-- Include/cpython/pydebug.h | 3 +-- Lib/test/test_embed.py | 1 - Programs/_testembed.c | 12 --------- Python/initconfig.c | 25 +++++++++++-------- Python/preconfig.c | 2 -- Tools/c-analyzer/cpython/ignored.tsv | 1 - 9 files changed, 17 insertions(+), 46 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 0437eb6b335481..d32144129548cd 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -128,19 +128,6 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. deprecated-removed:: 3.12 3.15 -.. c:var:: int Py_IgnoreEnvironmentFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.use_environment` should be used instead, see - :ref:`Python Initialization Configuration `. - - Ignore all :envvar:`!PYTHON*` environment variables, e.g. - :envvar:`PYTHONPATH` and :envvar:`PYTHONHOME`, that might be set. - - Set by the :option:`-E` and :option:`-I` options. - - .. deprecated-removed:: 3.12 3.15 - .. c:var:: int Py_InteractiveFlag diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index 34ad67d4e1ed2e..0dba73edca6346 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`Py_IgnoreEnvironmentFlag`: - Use :c:member:`PyConfig.use_environment` or - :c:func:`PyConfig_Get("use_environment") ` instead. * :c:var:`Py_DontWriteBytecodeFlag`: Use :c:member:`PyConfig.write_bytecode` or :c:func:`PyConfig_Get("write_bytecode") ` instead. diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 7ce4acfeb7177d..6b154a908a92b3 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -59,8 +59,7 @@ typedef struct PyPreConfig { int isolated; /* If greater than 0: use environment variables. - Set to 0 by -E command line option. If set to -1 (default), it is - set to !Py_IgnoreEnvironmentFlag. */ + Set to 0 by -E command line option. */ int use_environment; /* Set the LC_CTYPE locale to the user preferred locale? If equals to 0, diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index c2e65317e7f828..3eb55b227b7281 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -6,7 +6,6 @@ extern "C" { #endif Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_DontWriteBytecodeFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoUserSiteDirectory; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_UnbufferedStdioFlag; @@ -19,7 +18,7 @@ Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_LegacyWindowsStdioFlag; #endif /* this is a wrapper around getenv() that pays attention to - Py_IgnoreEnvironmentFlag. It should be used for getting variables like + PyConfig.use_environment. It should be used for getting variables like PYTHONPATH and PYTHONHOME from the environment */ PyAPI_FUNC(char*) Py_GETENV(const char *name); diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index f06a51de262e00..db729344cb3eeb 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -703,7 +703,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_DontWriteBytecodeFlag', 'write_bytecode', True), ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), - ('Py_IgnoreEnvironmentFlag', 'use_environment', True), ('Py_InteractiveFlag', 'interactive'), ('Py_IsolatedFlag', 'isolated'), ('Py_NoUserSiteDirectory', 'user_site_directory', True), diff --git a/Programs/_testembed.c b/Programs/_testembed.c index d795b900ed7862..997d702de09c0b 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -564,8 +564,6 @@ static int test_init_compat_config(void) static int test_init_global_config(void) { - /* FIXME: test Py_IgnoreEnvironmentFlag */ - putenv("PYTHONUTF8=0"); Py_UTF8Mode = 1; @@ -832,7 +830,6 @@ static void set_all_env_vars(void) static int test_init_compat_env(void) { /* Test initialization from environment variables */ - Py_IgnoreEnvironmentFlag = 0; set_all_env_vars(); _testembed_Py_InitializeFromConfig(); dump_config(); @@ -868,7 +865,6 @@ static void set_all_env_vars_dev_mode(void) static int test_init_env_dev_mode(void) { /* Test initialization from environment variables */ - Py_IgnoreEnvironmentFlag = 0; set_all_env_vars_dev_mode(); _testembed_Py_InitializeFromConfig(); dump_config(); @@ -880,7 +876,6 @@ static int test_init_env_dev_mode(void) static int test_init_env_dev_mode_alloc(void) { /* Test initialization from environment variables */ - Py_IgnoreEnvironmentFlag = 0; set_all_env_vars_dev_mode(); #ifndef Py_GIL_DISABLED putenv("PYTHONMALLOC=malloc"); @@ -1034,7 +1029,6 @@ static int test_preinit_parse_argv(void) static void set_all_global_config_variables(void) { Py_IsolatedFlag = 0; - Py_IgnoreEnvironmentFlag = 0; Py_InteractiveFlag = 1; Py_UnbufferedStdioFlag = 1; Py_DontWriteBytecodeFlag = 1; @@ -1103,7 +1097,6 @@ static int check_init_python_config(int preinit) /* global configuration variables must be ignored */ set_all_global_config_variables(); Py_IsolatedFlag = 1; - Py_IgnoreEnvironmentFlag = 1; Py_UnbufferedStdioFlag = 1; Py_DontWriteBytecodeFlag = 1; Py_NoUserSiteDirectory = 1; @@ -1216,7 +1209,6 @@ static int test_open_code_hook(void) return 2; } - Py_IgnoreEnvironmentFlag = 0; _testembed_Py_InitializeFromConfig(); result = 0; @@ -1279,7 +1271,6 @@ static int _test_audit(Py_ssize_t setValue) { Py_ssize_t sawSet = 0; - Py_IgnoreEnvironmentFlag = 0; PySys_AddAuditHook(_audit_hook, &sawSet); _testembed_Py_InitializeFromConfig(); @@ -1391,7 +1382,6 @@ static int _audit_subinterpreter_hook(const char *event, PyObject *args, void *u static int test_audit_subinterpreter(void) { - Py_IgnoreEnvironmentFlag = 0; PySys_AddAuditHook(_audit_subinterpreter_hook, NULL); _testembed_Py_InitializeFromConfig(); @@ -1438,7 +1428,6 @@ static int test_audit_run_command(void) AuditRunCommandTest test = {"cpython.run_command"}; wchar_t *argv[] = {PROGRAM_NAME, L"-c", L"pass"}; - Py_IgnoreEnvironmentFlag = 0; PySys_AddAuditHook(_audit_hook_run, (void*)&test); return Py_Main(Py_ARRAY_LENGTH(argv), argv); @@ -1449,7 +1438,6 @@ static int test_audit_run_file(void) AuditRunCommandTest test = {"cpython.run_file"}; wchar_t *argv[] = {PROGRAM_NAME, L"filename.py"}; - Py_IgnoreEnvironmentFlag = 0; PySys_AddAuditHook(_audit_hook_run, (void*)&test); return Py_Main(Py_ARRAY_LENGTH(argv), argv); diff --git a/Python/initconfig.c b/Python/initconfig.c index 596d88f0751144..2ba4c87bb24734 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -463,7 +463,6 @@ static const char usage_envvars[] = stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ -int Py_IgnoreEnvironmentFlag = 0; /* e.g. PYTHONPATH, PYTHONHOME */ int Py_DontWriteBytecodeFlag = 0; /* Suppress writing bytecode files (*.pyc) */ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */ @@ -516,7 +515,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_UTF8Mode); SET_ITEM_INT(Py_InteractiveFlag); - SET_ITEM_INT(Py_IgnoreEnvironmentFlag); SET_ITEM_INT(Py_DontWriteBytecodeFlag); SET_ITEM_INT(Py_NoUserSiteDirectory); SET_ITEM_INT(Py_UnbufferedStdioFlag); @@ -544,13 +542,22 @@ _Py_COMP_DIAG_POP char* Py_GETENV(const char *name) { -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - if (Py_IgnoreEnvironmentFlag) { + if (!_PyRuntime.core_initialized) { + // During pre-initialization, we cannot hold the GIL so we directly + // read from '_PyRuntime.preconfig' instead as it's not yet possible + // to change the 'use_environment' field. + return _PyRuntime.preconfig.use_environment ? getenv(name) : NULL; + } + PyGILState_STATE state = PyGILState_Ensure(); + PyObject *p_use_environment = PyConfig_Get("use_environment"); + PyGILState_Release(state); + if (p_use_environment == NULL) { + PyErr_Clear(); return NULL; } - return getenv(name); -_Py_COMP_DIAG_POP + bool use_environment = Py_IsTrue(p_use_environment); + Py_DECREF(p_use_environment); + return use_environment ? getenv(name) : NULL; } /* --- PyStatus ----------------------------------------------- */ @@ -991,7 +998,7 @@ _PyConfig_InitCompatConfig(PyConfig *config) config->_config_init = (int)_PyConfig_INIT_COMPAT; config->import_time = -1; config->isolated = -1; - config->use_environment = -1; + config->use_environment = 1; config->dev_mode = -1; config->install_signal_handlers = 1; config->use_hash_seed = -1; @@ -1657,7 +1664,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS } COPY_FLAG(isolated, Py_IsolatedFlag); - COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); COPY_FLAG(interactive, Py_InteractiveFlag); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); @@ -1689,7 +1695,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS } COPY_FLAG(isolated, Py_IsolatedFlag); - COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); COPY_FLAG(interactive, Py_InteractiveFlag); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); diff --git a/Python/preconfig.c b/Python/preconfig.c index 5b26c75de8b3a0..e9c4998a915b1c 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -482,7 +482,6 @@ preconfig_get_global_vars(PyPreConfig *config) _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(isolated, Py_IsolatedFlag); - COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); if (Py_UTF8Mode > 0) { config->utf8_mode = Py_UTF8Mode; } @@ -511,7 +510,6 @@ preconfig_set_global_vars(const PyPreConfig *config) _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(isolated, Py_IsolatedFlag); - COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); #endif diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 8a1489fc5e6231..d1a5d6b8da98ab 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -110,7 +110,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - Python/initconfig.c - Py_InteractiveFlag - -Python/initconfig.c - Py_IgnoreEnvironmentFlag - Python/initconfig.c - Py_DontWriteBytecodeFlag - Python/initconfig.c - Py_NoUserSiteDirectory - Python/initconfig.c - Py_UnbufferedStdioFlag - From 311f95c8d82094d60fc3a1e86d41ee246397b233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:48:01 +0200 Subject: [PATCH 10/28] remove `Py_DontWriteBytecodeFlag` --- Doc/c-api/init.rst | 15 --------------- .../c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 1 - Programs/_testembed.c | 4 ---- Python/initconfig.c | 4 ---- Tools/c-analyzer/cpython/ignored.tsv | 1 - 7 files changed, 29 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index d32144129548cd..1e949ae1f0b388 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -98,21 +98,6 @@ that the option was set. For example, ``-b`` sets :c:data:`Py_BytesWarningFlag` to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. -.. c:var:: int Py_DontWriteBytecodeFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.write_bytecode` should be used instead, see :ref:`Python - Initialization Configuration `. - - If set to non-zero, Python won't try to write ``.pyc`` files on the - import of source modules. - - Set by the :option:`-B` option and the :envvar:`PYTHONDONTWRITEBYTECODE` - environment variable. - - .. deprecated-removed:: 3.12 3.15 - - .. c:var:: int Py_HashRandomizationFlag This API is kept for backward compatibility: setting diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index 0dba73edca6346..abdeb6182d7ea5 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`Py_DontWriteBytecodeFlag`: - Use :c:member:`PyConfig.write_bytecode` or - :c:func:`PyConfig_Get("write_bytecode") ` instead. * :c:var:`Py_NoUserSiteDirectory`: Use :c:member:`PyConfig.user_site_directory` or :c:func:`PyConfig_Get("user_site_directory") ` instead. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 3eb55b227b7281..7ba6d77f77d3cd 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -6,7 +6,6 @@ extern "C" { #endif Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_DontWriteBytecodeFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoUserSiteDirectory; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_UnbufferedStdioFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_HashRandomizationFlag; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index db729344cb3eeb..249d4695991fec 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -700,7 +700,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): COPY_GLOBAL_CONFIG = [ # Copy core config to global config for expected values # True means that the core config value is inverted (0 => 1 and 1 => 0) - ('Py_DontWriteBytecodeFlag', 'write_bytecode', True), ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), ('Py_InteractiveFlag', 'interactive'), diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 997d702de09c0b..860a0c5b570d18 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -578,7 +578,6 @@ static int test_init_global_config(void) putenv("PYTHONDEBUG=0"); putenv("PYTHONDONTWRITEBYTECODE="); - Py_DontWriteBytecodeFlag = 1; putenv("PYTHONVERBOSE=0"); @@ -708,7 +707,6 @@ static int test_init_from_config(void) /* FIXME: test parser_debug */ putenv("PYTHONDONTWRITEBYTECODE="); - Py_DontWriteBytecodeFlag = 0; config.write_bytecode = 0; config.quiet = 1; @@ -1031,7 +1029,6 @@ static void set_all_global_config_variables(void) Py_IsolatedFlag = 0; Py_InteractiveFlag = 1; Py_UnbufferedStdioFlag = 1; - Py_DontWriteBytecodeFlag = 1; Py_NoUserSiteDirectory = 1; #ifdef MS_WINDOWS Py_LegacyWindowsStdioFlag = 1; @@ -1098,7 +1095,6 @@ static int check_init_python_config(int preinit) set_all_global_config_variables(); Py_IsolatedFlag = 1; Py_UnbufferedStdioFlag = 1; - Py_DontWriteBytecodeFlag = 1; Py_NoUserSiteDirectory = 1; #ifdef MS_WINDOWS Py_LegacyWindowsStdioFlag = 1; diff --git a/Python/initconfig.c b/Python/initconfig.c index 2ba4c87bb24734..52c28dddd1b570 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -463,7 +463,6 @@ static const char usage_envvars[] = stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ -int Py_DontWriteBytecodeFlag = 0; /* Suppress writing bytecode files (*.pyc) */ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */ int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ @@ -515,7 +514,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_UTF8Mode); SET_ITEM_INT(Py_InteractiveFlag); - SET_ITEM_INT(Py_DontWriteBytecodeFlag); SET_ITEM_INT(Py_NoUserSiteDirectory); SET_ITEM_INT(Py_UnbufferedStdioFlag); SET_ITEM_INT(Py_HashRandomizationFlag); @@ -1670,7 +1668,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS #endif COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); - COPY_NOT_FLAG(write_bytecode, Py_DontWriteBytecodeFlag); COPY_NOT_FLAG(user_site_directory, Py_NoUserSiteDirectory); #undef COPY_FLAG @@ -1701,7 +1698,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS #endif COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); - COPY_NOT_FLAG(write_bytecode, Py_DontWriteBytecodeFlag); COPY_NOT_FLAG(user_site_directory, Py_NoUserSiteDirectory); /* Random or non-zero hash seed */ diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index d1a5d6b8da98ab..d47a9eee176fc9 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -110,7 +110,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - Python/initconfig.c - Py_InteractiveFlag - -Python/initconfig.c - Py_DontWriteBytecodeFlag - Python/initconfig.c - Py_NoUserSiteDirectory - Python/initconfig.c - Py_UnbufferedStdioFlag - Python/initconfig.c - Py_HashRandomizationFlag - From f5b39db566247c9e68458f3d323fb360fb188fb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:48:50 +0200 Subject: [PATCH 11/28] remove `Py_NoUserSiteDirectory` --- Doc/c-api/init.rst | 15 --------------- .../c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 1 - Programs/_testembed.c | 5 ----- Python/initconfig.c | 4 ---- Tools/c-analyzer/cpython/ignored.tsv | 1 - 7 files changed, 30 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 1e949ae1f0b388..6ca80888d049bd 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -177,21 +177,6 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. deprecated-removed:: 3.12 3.15 -.. c:var:: int Py_NoUserSiteDirectory - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.user_site_directory` should be used instead, see - :ref:`Python Initialization Configuration `. - - Don't add the :data:`user site-packages directory ` to - :data:`sys.path`. - - Set by the :option:`-s` and :option:`-I` options, and the - :envvar:`PYTHONNOUSERSITE` environment variable. - - .. deprecated-removed:: 3.12 3.15 - - .. c:var:: int Py_UnbufferedStdioFlag This API is kept for backward compatibility: setting diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index abdeb6182d7ea5..38276dd79efff5 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`Py_NoUserSiteDirectory`: - Use :c:member:`PyConfig.user_site_directory` or - :c:func:`PyConfig_Get("user_site_directory") ` instead. * :c:var:`Py_UnbufferedStdioFlag`: Use :c:member:`PyConfig.buffered_stdio` or :c:func:`PyConfig_Get("buffered_stdio") ` instead. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 7ba6d77f77d3cd..37320a0bf5ddc2 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -6,7 +6,6 @@ extern "C" { #endif Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoUserSiteDirectory; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_UnbufferedStdioFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_HashRandomizationFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IsolatedFlag; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 249d4695991fec..fe6a28bec5604e 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -704,7 +704,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), ('Py_InteractiveFlag', 'interactive'), ('Py_IsolatedFlag', 'isolated'), - ('Py_NoUserSiteDirectory', 'user_site_directory', True), ('Py_UnbufferedStdioFlag', 'buffered_stdio', True), ] if MS_WINDOWS: diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 860a0c5b570d18..3eb7d03b8496a2 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -581,8 +581,6 @@ static int test_init_global_config(void) putenv("PYTHONVERBOSE=0"); - Py_NoUserSiteDirectory = 1; - putenv("PYTHONUNBUFFERED="); Py_UnbufferedStdioFlag = 1; @@ -722,7 +720,6 @@ static int test_init_from_config(void) config_set_string(&config, &config.stdio_errors, L"replace"); putenv("PYTHONNOUSERSITE="); - Py_NoUserSiteDirectory = 0; config.user_site_directory = 0; config_set_string(&config, &config.check_hash_pycs_mode, L"always"); @@ -1029,7 +1026,6 @@ static void set_all_global_config_variables(void) Py_IsolatedFlag = 0; Py_InteractiveFlag = 1; Py_UnbufferedStdioFlag = 1; - Py_NoUserSiteDirectory = 1; #ifdef MS_WINDOWS Py_LegacyWindowsStdioFlag = 1; #endif @@ -1095,7 +1091,6 @@ static int check_init_python_config(int preinit) set_all_global_config_variables(); Py_IsolatedFlag = 1; Py_UnbufferedStdioFlag = 1; - Py_NoUserSiteDirectory = 1; #ifdef MS_WINDOWS Py_LegacyWindowsStdioFlag = 1; #endif diff --git a/Python/initconfig.c b/Python/initconfig.c index 52c28dddd1b570..c8a0c5735c12c2 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -463,7 +463,6 @@ static const char usage_envvars[] = stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ -int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */ int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ int Py_IsolatedFlag = 0; /* for -I, isolate from user's env */ @@ -514,7 +513,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_UTF8Mode); SET_ITEM_INT(Py_InteractiveFlag); - SET_ITEM_INT(Py_NoUserSiteDirectory); SET_ITEM_INT(Py_UnbufferedStdioFlag); SET_ITEM_INT(Py_HashRandomizationFlag); SET_ITEM_INT(Py_IsolatedFlag); @@ -1668,7 +1666,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS #endif COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); - COPY_NOT_FLAG(user_site_directory, Py_NoUserSiteDirectory); #undef COPY_FLAG #undef COPY_NOT_FLAG @@ -1698,7 +1695,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS #endif COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); - COPY_NOT_FLAG(user_site_directory, Py_NoUserSiteDirectory); /* Random or non-zero hash seed */ Py_HashRandomizationFlag = (config->use_hash_seed == 0 || diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index d47a9eee176fc9..3dc6297283a8d7 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -110,7 +110,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - Python/initconfig.c - Py_InteractiveFlag - -Python/initconfig.c - Py_NoUserSiteDirectory - Python/initconfig.c - Py_UnbufferedStdioFlag - Python/initconfig.c - Py_HashRandomizationFlag - Python/initconfig.c - Py_IsolatedFlag - From c66edb3056be3b1ea800aea9247cc50ed7a5f462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:49:32 +0200 Subject: [PATCH 12/28] remove `Py_UnbufferedStdioFlag` --- Doc/c-api/init.rst | 14 -------------- Doc/deprecations/c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 1 - Programs/_testembed.c | 4 ---- Python/initconfig.c | 8 +------- Tools/c-analyzer/cpython/ignored.tsv | 1 - 7 files changed, 1 insertion(+), 31 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 6ca80888d049bd..eb91af6bc6b662 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -177,20 +177,6 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. deprecated-removed:: 3.12 3.15 -.. c:var:: int Py_UnbufferedStdioFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.buffered_stdio` should be used instead, see :ref:`Python - Initialization Configuration `. - - Force the stdout and stderr streams to be unbuffered. - - Set by the :option:`-u` option and the :envvar:`PYTHONUNBUFFERED` - environment variable. - - .. deprecated-removed:: 3.12 3.15 - - Initializing and finalizing the interpreter =========================================== diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index 38276dd79efff5..e3a62c5f2877b9 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`Py_UnbufferedStdioFlag`: - Use :c:member:`PyConfig.buffered_stdio` or - :c:func:`PyConfig_Get("buffered_stdio") ` instead. * :c:var:`Py_HashRandomizationFlag`: Use :c:member:`PyConfig.use_hash_seed` and :c:member:`PyConfig.hash_seed` or diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 37320a0bf5ddc2..670e9b61d6d06d 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -6,7 +6,6 @@ extern "C" { #endif Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_UnbufferedStdioFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_HashRandomizationFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IsolatedFlag; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index fe6a28bec5604e..710be927d5b7a4 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -704,7 +704,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), ('Py_InteractiveFlag', 'interactive'), ('Py_IsolatedFlag', 'isolated'), - ('Py_UnbufferedStdioFlag', 'buffered_stdio', True), ] if MS_WINDOWS: COPY_GLOBAL_PRE_CONFIG.extend(( diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 3eb7d03b8496a2..75aa4a9761724c 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -582,7 +582,6 @@ static int test_init_global_config(void) putenv("PYTHONVERBOSE=0"); putenv("PYTHONUNBUFFERED="); - Py_UnbufferedStdioFlag = 1; /* FIXME: test Py_LegacyWindowsFSEncodingFlag */ /* FIXME: test Py_LegacyWindowsStdioFlag */ @@ -712,7 +711,6 @@ static int test_init_from_config(void) config.configure_c_stdio = 1; putenv("PYTHONUNBUFFERED="); - Py_UnbufferedStdioFlag = 0; config.buffered_stdio = 0; putenv("PYTHONIOENCODING=cp424"); @@ -1025,7 +1023,6 @@ static void set_all_global_config_variables(void) { Py_IsolatedFlag = 0; Py_InteractiveFlag = 1; - Py_UnbufferedStdioFlag = 1; #ifdef MS_WINDOWS Py_LegacyWindowsStdioFlag = 1; #endif @@ -1090,7 +1087,6 @@ static int check_init_python_config(int preinit) /* global configuration variables must be ignored */ set_all_global_config_variables(); Py_IsolatedFlag = 1; - Py_UnbufferedStdioFlag = 1; #ifdef MS_WINDOWS Py_LegacyWindowsStdioFlag = 1; #endif diff --git a/Python/initconfig.c b/Python/initconfig.c index c8a0c5735c12c2..ab090142dee124 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -463,7 +463,6 @@ static const char usage_envvars[] = stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ -int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */ int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ int Py_IsolatedFlag = 0; /* for -I, isolate from user's env */ #ifdef MS_WINDOWS @@ -513,7 +512,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_UTF8Mode); SET_ITEM_INT(Py_InteractiveFlag); - SET_ITEM_INT(Py_UnbufferedStdioFlag); SET_ITEM_INT(Py_HashRandomizationFlag); SET_ITEM_INT(Py_IsolatedFlag); @@ -1016,7 +1014,7 @@ _PyConfig_InitCompatConfig(PyConfig *config) config->quiet = 0; config->user_site_directory = 1; config->configure_c_stdio = 0; - config->buffered_stdio = -1; + config->buffered_stdio = 1; config->_install_importlib = 1; config->check_hash_pycs_mode = NULL; config->pathconfig_warnings = 1; @@ -1665,8 +1663,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif - COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); - #undef COPY_FLAG #undef COPY_NOT_FLAG _Py_COMP_DIAG_POP @@ -1694,8 +1690,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif - COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); - /* Random or non-zero hash seed */ Py_HashRandomizationFlag = (config->use_hash_seed == 0 || config->hash_seed != 0); diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 3dc6297283a8d7..a810502cff7541 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -110,7 +110,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - Python/initconfig.c - Py_InteractiveFlag - -Python/initconfig.c - Py_UnbufferedStdioFlag - Python/initconfig.c - Py_HashRandomizationFlag - Python/initconfig.c - Py_IsolatedFlag - Python/initconfig.c - Py_LegacyWindowsFSEncodingFlag - From 9116a65fabf4b308213106aacd49a44741af9423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:50:40 +0200 Subject: [PATCH 13/28] remove `Py_HashRandomizationFlag` --- Doc/c-api/init.rst | 16 ---------------- .../c-api-pending-removal-in-3.15.rst | 4 ---- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 1 - Python/initconfig.c | 6 ------ Tools/c-analyzer/cpython/ignored.tsv | 1 - 6 files changed, 29 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index eb91af6bc6b662..1150713a2fc9de 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -98,22 +98,6 @@ that the option was set. For example, ``-b`` sets :c:data:`Py_BytesWarningFlag` to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. -.. c:var:: int Py_HashRandomizationFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.hash_seed` and :c:member:`PyConfig.use_hash_seed` should - be used instead, see :ref:`Python Initialization Configuration - `. - - Set to ``1`` if the :envvar:`PYTHONHASHSEED` environment variable is set to - a non-empty string. - - If the flag is non-zero, read the :envvar:`PYTHONHASHSEED` environment - variable to initialize the secret hash seed. - - .. deprecated-removed:: 3.12 3.15 - - .. c:var:: int Py_InteractiveFlag This API is kept for backward compatibility: setting diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index e3a62c5f2877b9..0d4fe09943cb5e 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,10 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`Py_HashRandomizationFlag`: - Use :c:member:`PyConfig.use_hash_seed` - and :c:member:`PyConfig.hash_seed` or - :c:func:`PyConfig_Get("hash_seed") ` instead. * :c:var:`Py_IsolatedFlag`: Use :c:member:`PyConfig.isolated` or :c:func:`PyConfig_Get("isolated") ` instead. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 670e9b61d6d06d..06a078251a3737 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -6,7 +6,6 @@ extern "C" { #endif Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_HashRandomizationFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IsolatedFlag; #ifdef MS_WINDOWS diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 710be927d5b7a4..be2f18fd13ec2f 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -691,7 +691,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): # global config DEFAULT_GLOBAL_CONFIG = { 'Py_HasFileSystemDefaultEncoding': 0, - 'Py_HashRandomizationFlag': 1, '_Py_HasFileSystemDefaultEncodeErrors': 0, } COPY_GLOBAL_PRE_CONFIG = [ diff --git a/Python/initconfig.c b/Python/initconfig.c index ab090142dee124..024d5a469b6a2c 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -463,7 +463,6 @@ static const char usage_envvars[] = stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ -int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ int Py_IsolatedFlag = 0; /* for -I, isolate from user's env */ #ifdef MS_WINDOWS int Py_LegacyWindowsFSEncodingFlag = 0; /* Uses mbcs instead of utf-8 */ @@ -512,7 +511,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_UTF8Mode); SET_ITEM_INT(Py_InteractiveFlag); - SET_ITEM_INT(Py_HashRandomizationFlag); SET_ITEM_INT(Py_IsolatedFlag); #ifdef MS_WINDOWS @@ -1690,10 +1688,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif - /* Random or non-zero hash seed */ - Py_HashRandomizationFlag = (config->use_hash_seed == 0 || - config->hash_seed != 0); - #undef COPY_FLAG #undef COPY_NOT_FLAG _Py_COMP_DIAG_POP diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index a810502cff7541..349e321477bc7e 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -110,7 +110,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - Python/initconfig.c - Py_InteractiveFlag - -Python/initconfig.c - Py_HashRandomizationFlag - Python/initconfig.c - Py_IsolatedFlag - Python/initconfig.c - Py_LegacyWindowsFSEncodingFlag - Python/initconfig.c - Py_LegacyWindowsStdioFlag - From fb2a247c9b9e33e0f1f5a330be31d8ea41359e8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:54:51 +0200 Subject: [PATCH 14/28] remove `Py_IsolatedFlag` --- Doc/c-api/init.rst | 14 -------------- Doc/deprecations/c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/initconfig.h | 3 +-- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 1 - Programs/_testembed.c | 4 ---- Python/initconfig.c | 5 ----- Python/preconfig.c | 4 +--- Python/sysmodule.c | 12 +++++++++++- Tools/c-analyzer/cpython/ignored.tsv | 1 - 10 files changed, 13 insertions(+), 35 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 1150713a2fc9de..d25a6910b12cbd 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -108,20 +108,6 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. deprecated:: 3.12 -.. c:var:: int Py_IsolatedFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.isolated` should be used instead, see - :ref:`Python Initialization Configuration `. - - Run Python in isolated mode. In isolated mode :data:`sys.path` contains - neither the script's directory nor the user's site-packages directory. - - Set by the :option:`-I` option. - - .. versionadded:: 3.4 - - .. deprecated-removed:: 3.12 3.15 .. c:var:: int Py_LegacyWindowsFSEncodingFlag diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index 0d4fe09943cb5e..6118867a9b3c98 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`Py_IsolatedFlag`: - Use :c:member:`PyConfig.isolated` or - :c:func:`PyConfig_Get("isolated") ` instead. * :c:var:`Py_LegacyWindowsFSEncodingFlag`: Use :c:member:`PyPreConfig.legacy_windows_fs_encoding` or :c:func:`PyConfig_Get("legacy_windows_fs_encoding") ` instead. diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 6b154a908a92b3..f238a894e1312b 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -54,8 +54,7 @@ typedef struct PyPreConfig { /* If greater than 0, enable isolated mode: sys.path contains neither the script's directory nor the user's site-packages directory. - Set to 1 by the -I command line option. If set to -1 (default), inherit - Py_IsolatedFlag value. */ + Set to 1 by the -I command line option. */ int isolated; /* If greater than 0: use environment variables. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 06a078251a3737..fc301f990429d1 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -6,7 +6,6 @@ extern "C" { #endif Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IsolatedFlag; #ifdef MS_WINDOWS Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_LegacyWindowsFSEncodingFlag; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index be2f18fd13ec2f..fe94d9b6c9eaa3 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -702,7 +702,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), ('Py_InteractiveFlag', 'interactive'), - ('Py_IsolatedFlag', 'isolated'), ] if MS_WINDOWS: COPY_GLOBAL_PRE_CONFIG.extend(( diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 75aa4a9761724c..8e485abff7bf59 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -888,7 +888,6 @@ static int test_init_isolated_flag(void) PyConfig config; PyConfig_InitPythonConfig(&config); - Py_IsolatedFlag = 0; config.isolated = 1; // These options are set to 1 by isolated=1 config.safe_path = 0; @@ -948,7 +947,6 @@ static int test_preinit_isolated2(void) PyConfig config; _PyConfig_InitCompatConfig(&config); - Py_IsolatedFlag = 0; config.isolated = 1; config_set_program_name(&config); @@ -1021,7 +1019,6 @@ static int test_preinit_parse_argv(void) static void set_all_global_config_variables(void) { - Py_IsolatedFlag = 0; Py_InteractiveFlag = 1; #ifdef MS_WINDOWS Py_LegacyWindowsStdioFlag = 1; @@ -1086,7 +1083,6 @@ static int check_init_python_config(int preinit) { /* global configuration variables must be ignored */ set_all_global_config_variables(); - Py_IsolatedFlag = 1; #ifdef MS_WINDOWS Py_LegacyWindowsStdioFlag = 1; #endif diff --git a/Python/initconfig.c b/Python/initconfig.c index 024d5a469b6a2c..09f8cdb4a0f241 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -463,7 +463,6 @@ static const char usage_envvars[] = stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ -int Py_IsolatedFlag = 0; /* for -I, isolate from user's env */ #ifdef MS_WINDOWS int Py_LegacyWindowsFSEncodingFlag = 0; /* Uses mbcs instead of utf-8 */ int Py_LegacyWindowsStdioFlag = 0; /* Uses FileIO instead of WindowsConsoleIO */ @@ -511,8 +510,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_UTF8Mode); SET_ITEM_INT(Py_InteractiveFlag); - SET_ITEM_INT(Py_IsolatedFlag); - #ifdef MS_WINDOWS SET_ITEM_INT(Py_LegacyWindowsFSEncodingFlag); SET_ITEM_INT(Py_LegacyWindowsStdioFlag); @@ -1655,7 +1652,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS config->ATTR = !(VALUE); \ } - COPY_FLAG(isolated, Py_IsolatedFlag); COPY_FLAG(interactive, Py_InteractiveFlag); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); @@ -1682,7 +1678,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS VAR = !config->ATTR; \ } - COPY_FLAG(isolated, Py_IsolatedFlag); COPY_FLAG(interactive, Py_InteractiveFlag); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); diff --git a/Python/preconfig.c b/Python/preconfig.c index e9c4998a915b1c..5ec590f2231c5a 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -287,7 +287,7 @@ _PyPreConfig_InitCompatConfig(PyPreConfig *config) config->_config_init = (int)_PyConfig_INIT_COMPAT; config->parse_argv = 0; - config->isolated = -1; + config->isolated = 0; config->use_environment = -1; config->configure_locale = 1; @@ -481,7 +481,6 @@ preconfig_get_global_vars(PyPreConfig *config) _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS - COPY_FLAG(isolated, Py_IsolatedFlag); if (Py_UTF8Mode > 0) { config->utf8_mode = Py_UTF8Mode; } @@ -509,7 +508,6 @@ preconfig_set_global_vars(const PyPreConfig *config) _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS - COPY_FLAG(isolated, Py_IsolatedFlag); #ifdef MS_WINDOWS COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); #endif diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 00dce4527fbb90..0de2e352656486 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -4266,9 +4266,19 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) void PySys_SetArgv(int argc, wchar_t **argv) { + PyGILState_STATE state = PyGILState_Ensure(); + PyObject *isolated = PyConfig_Get("isolated"); + PyGILState_Release(state); + if (isolated == NULL) { + PyErr_Clear(); + Py_FatalError("cannot retrieve PyConfig.isolated"); + return; + } + bool updatepath = Py_IsFalse(isolated); + Py_DECREF(isolated); _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS - PySys_SetArgvEx(argc, argv, Py_IsolatedFlag == 0); + PySys_SetArgvEx(argc, argv, updatepath); _Py_COMP_DIAG_POP } diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 349e321477bc7e..f437dc1349a806 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -110,7 +110,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - Python/initconfig.c - Py_InteractiveFlag - -Python/initconfig.c - Py_IsolatedFlag - Python/initconfig.c - Py_LegacyWindowsFSEncodingFlag - Python/initconfig.c - Py_LegacyWindowsStdioFlag - From 86c0c87cec4725f671552b14ca8575972a6e442d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:56:38 +0200 Subject: [PATCH 15/28] remove `Py_LegacyWindowsFSEncodingFlag` --- Doc/c-api/init.rst | 19 ------------------- .../c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/initconfig.h | 3 +-- Include/cpython/pydebug.h | 1 - Lib/test/test_embed.py | 3 --- Programs/_testembed.c | 1 - Python/initconfig.c | 2 -- Python/preconfig.c | 6 ------ Tools/c-analyzer/cpython/ignored.tsv | 1 - 9 files changed, 1 insertion(+), 38 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index d25a6910b12cbd..d29a8f3146f89b 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -109,25 +109,6 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. deprecated:: 3.12 -.. c:var:: int Py_LegacyWindowsFSEncodingFlag - - This API is kept for backward compatibility: setting - :c:member:`PyPreConfig.legacy_windows_fs_encoding` should be used instead, see - :ref:`Python Initialization Configuration `. - - If the flag is non-zero, use the ``mbcs`` encoding with ``replace`` error - handler, instead of the UTF-8 encoding with ``surrogatepass`` error handler, - for the :term:`filesystem encoding and error handler`. - - Set to ``1`` if the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment - variable is set to a non-empty string. - - See :pep:`529` for more details. - - .. availability:: Windows. - - .. deprecated-removed:: 3.12 3.15 - .. c:var:: int Py_LegacyWindowsStdioFlag This API is kept for backward compatibility: setting diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index 6118867a9b3c98..4b62ae72a934d2 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`Py_LegacyWindowsFSEncodingFlag`: - Use :c:member:`PyPreConfig.legacy_windows_fs_encoding` or - :c:func:`PyConfig_Get("legacy_windows_fs_encoding") ` instead. * :c:var:`Py_LegacyWindowsStdioFlag`: Use :c:member:`PyConfig.legacy_windows_stdio` or :c:func:`PyConfig_Get("legacy_windows_stdio") ` instead. diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index f238a894e1312b..9b854ed7bcce20 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -91,8 +91,7 @@ typedef struct PyPreConfig { encoding for the filesystem encoding. Set to 1 if the PYTHONLEGACYWINDOWSFSENCODING environment variable is - set to a non-empty string. If set to -1 (default), inherit - Py_LegacyWindowsFSEncodingFlag value. + set to a non-empty string. See PEP 529 for more details. */ int legacy_windows_fs_encoding; diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index fc301f990429d1..88d5fa42576684 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -8,7 +8,6 @@ extern "C" { Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; #ifdef MS_WINDOWS -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_LegacyWindowsFSEncodingFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_LegacyWindowsStdioFlag; #endif diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index fe94d9b6c9eaa3..be0a7aed3b19a1 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -704,9 +704,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_InteractiveFlag', 'interactive'), ] if MS_WINDOWS: - COPY_GLOBAL_PRE_CONFIG.extend(( - ('Py_LegacyWindowsFSEncodingFlag', 'legacy_windows_fs_encoding'), - )) COPY_GLOBAL_CONFIG.extend(( ('Py_LegacyWindowsStdioFlag', 'legacy_windows_stdio'), )) diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 8e485abff7bf59..dc6ef8945c5729 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -583,7 +583,6 @@ static int test_init_global_config(void) putenv("PYTHONUNBUFFERED="); - /* FIXME: test Py_LegacyWindowsFSEncodingFlag */ /* FIXME: test Py_LegacyWindowsStdioFlag */ Py_Initialize(); diff --git a/Python/initconfig.c b/Python/initconfig.c index 09f8cdb4a0f241..a3d8596509e8be 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -464,7 +464,6 @@ static const char usage_envvars[] = int Py_UTF8Mode = 0; int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ #ifdef MS_WINDOWS -int Py_LegacyWindowsFSEncodingFlag = 0; /* Uses mbcs instead of utf-8 */ int Py_LegacyWindowsStdioFlag = 0; /* Uses FileIO instead of WindowsConsoleIO */ #endif @@ -511,7 +510,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_InteractiveFlag); #ifdef MS_WINDOWS - SET_ITEM_INT(Py_LegacyWindowsFSEncodingFlag); SET_ITEM_INT(Py_LegacyWindowsStdioFlag); #endif diff --git a/Python/preconfig.c b/Python/preconfig.c index 5ec590f2231c5a..66142b12a02c3e 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -484,9 +484,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS if (Py_UTF8Mode > 0) { config->utf8_mode = Py_UTF8Mode; } -#ifdef MS_WINDOWS - COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); -#endif _Py_COMP_DIAG_POP #undef COPY_FLAG @@ -508,9 +505,6 @@ preconfig_set_global_vars(const PyPreConfig *config) _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS -#ifdef MS_WINDOWS - COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); -#endif COPY_FLAG(utf8_mode, Py_UTF8Mode); _Py_COMP_DIAG_POP diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index f437dc1349a806..b916508bb1901c 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -110,7 +110,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - Python/initconfig.c - Py_InteractiveFlag - -Python/initconfig.c - Py_LegacyWindowsFSEncodingFlag - Python/initconfig.c - Py_LegacyWindowsStdioFlag - ##----------------------- From eab9e010e3e6c008eb3e78c16b9ce380d792b431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 09:57:39 +0200 Subject: [PATCH 16/28] remove `Py_LegacyWindowsStdioFlag` --- Doc/c-api/init.rst | 19 ------------------- .../c-api-pending-removal-in-3.15.rst | 3 --- Include/cpython/pydebug.h | 4 ---- Lib/test/test_embed.py | 4 ---- Programs/_testembed.c | 8 -------- Python/initconfig.c | 15 +-------------- Tools/c-analyzer/cpython/ignored.tsv | 1 - 7 files changed, 1 insertion(+), 53 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index d29a8f3146f89b..7139229dc90d07 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -109,25 +109,6 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. deprecated:: 3.12 -.. c:var:: int Py_LegacyWindowsStdioFlag - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.legacy_windows_stdio` should be used instead, see - :ref:`Python Initialization Configuration `. - - If the flag is non-zero, use :class:`io.FileIO` instead of - :class:`!io._WindowsConsoleIO` for :mod:`sys` standard streams. - - Set to ``1`` if the :envvar:`PYTHONLEGACYWINDOWSSTDIO` environment - variable is set to a non-empty string. - - See :pep:`528` for more details. - - .. availability:: Windows. - - .. deprecated-removed:: 3.12 3.15 - - Initializing and finalizing the interpreter =========================================== diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index 4b62ae72a934d2..e66e48353ca7c0 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`Py_LegacyWindowsStdioFlag`: - Use :c:member:`PyConfig.legacy_windows_stdio` or - :c:func:`PyConfig_Get("legacy_windows_stdio") ` instead. * :c:var:`!Py_FileSystemDefaultEncoding`, :c:var:`!Py_HasFileSystemDefaultEncoding`: Use :c:member:`PyConfig.filesystem_encoding` or :c:func:`PyConfig_Get("filesystem_encoding") ` instead. diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 88d5fa42576684..43b8049a969ac7 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -7,10 +7,6 @@ extern "C" { Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; -#ifdef MS_WINDOWS -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_LegacyWindowsStdioFlag; -#endif - /* this is a wrapper around getenv() that pays attention to PyConfig.use_environment. It should be used for getting variables like PYTHONPATH and PYTHONHOME from the environment */ diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index be0a7aed3b19a1..e9b5fd7b0db709 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -703,10 +703,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), ('Py_InteractiveFlag', 'interactive'), ] - if MS_WINDOWS: - COPY_GLOBAL_CONFIG.extend(( - ('Py_LegacyWindowsStdioFlag', 'legacy_windows_stdio'), - )) EXPECTED_CONFIG = None diff --git a/Programs/_testembed.c b/Programs/_testembed.c index dc6ef8945c5729..368736b84cff91 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -583,8 +583,6 @@ static int test_init_global_config(void) putenv("PYTHONUNBUFFERED="); - /* FIXME: test Py_LegacyWindowsStdioFlag */ - Py_Initialize(); dump_config(); Py_Finalize(); @@ -1019,9 +1017,6 @@ static int test_preinit_parse_argv(void) static void set_all_global_config_variables(void) { Py_InteractiveFlag = 1; -#ifdef MS_WINDOWS - Py_LegacyWindowsStdioFlag = 1; -#endif } @@ -1082,9 +1077,6 @@ static int check_init_python_config(int preinit) { /* global configuration variables must be ignored */ set_all_global_config_variables(); -#ifdef MS_WINDOWS - Py_LegacyWindowsStdioFlag = 1; -#endif if (preinit) { PyPreConfig preconfig; diff --git a/Python/initconfig.c b/Python/initconfig.c index a3d8596509e8be..c2e4919f6638ab 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -463,9 +463,6 @@ static const char usage_envvars[] = stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ -#ifdef MS_WINDOWS -int Py_LegacyWindowsStdioFlag = 0; /* Uses FileIO instead of WindowsConsoleIO */ -#endif static PyObject * @@ -509,10 +506,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS SET_ITEM_INT(Py_UTF8Mode); SET_ITEM_INT(Py_InteractiveFlag); -#ifdef MS_WINDOWS - SET_ITEM_INT(Py_LegacyWindowsStdioFlag); -#endif - return dict; fail: @@ -1013,7 +1006,7 @@ _PyConfig_InitCompatConfig(PyConfig *config) config->pathconfig_warnings = 1; config->_init_main = 1; #ifdef MS_WINDOWS - config->legacy_windows_stdio = -1; + config->legacy_windows_stdio = 0; #endif #ifdef Py_DEBUG config->use_frozen_modules = 0; @@ -1651,9 +1644,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS } COPY_FLAG(interactive, Py_InteractiveFlag); -#ifdef MS_WINDOWS - COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); -#endif #undef COPY_FLAG #undef COPY_NOT_FLAG @@ -1677,9 +1667,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS } COPY_FLAG(interactive, Py_InteractiveFlag); -#ifdef MS_WINDOWS - COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); -#endif #undef COPY_FLAG #undef COPY_NOT_FLAG diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index b916508bb1901c..d149296fe85f13 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -110,7 +110,6 @@ Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - Python/initconfig.c - Py_InteractiveFlag - -Python/initconfig.c - Py_LegacyWindowsStdioFlag - ##----------------------- ## initialized statically, may be customized by embedders From 54ff2aac82167bc3e806caf6550b426f8bfa51b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 10:00:54 +0200 Subject: [PATCH 17/28] remove `Py_FileSystemDefaultEncoding` and `Py_HasFileSystemDefaultEncoding` --- Doc/data/stable_abi.dat | 2 -- Doc/deprecations/c-api-pending-removal-in-3.15.rst | 3 --- Include/fileobject.h | 2 -- Lib/test/test_embed.py | 2 -- Lib/test/test_stable_abi_ctypes.py | 2 -- Misc/stable_abi.toml | 4 ---- Objects/unicodeobject.c | 2 +- PC/python3dll.c | 2 -- Python/initconfig.c | 2 -- Python/preconfig.c | 11 +---------- Tools/c-analyzer/cpython/ignored.tsv | 2 -- 11 files changed, 2 insertions(+), 32 deletions(-) diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index 3d68487d07baf2..8186836f5ccd84 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -852,7 +852,6 @@ func,Py_EnterRecursiveCall,3.9,, func,Py_Exit,3.2,, func,Py_FatalError,3.2,, data,Py_FileSystemDefaultEncodeErrors,3.10,, -data,Py_FileSystemDefaultEncoding,3.2,, func,Py_Finalize,3.2,, func,Py_FinalizeEx,3.6,, func,Py_GenericAlias,3.9,, @@ -871,7 +870,6 @@ func,Py_GetProgramName,3.2,, func,Py_GetPythonHome,3.2,, func,Py_GetRecursionLimit,3.2,, func,Py_GetVersion,3.2,, -data,Py_HasFileSystemDefaultEncoding,3.2,, func,Py_IncRef,3.2,, func,Py_Initialize,3.2,, func,Py_InitializeEx,3.2,, diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index e66e48353ca7c0..a61fada9f0b0b4 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`!Py_FileSystemDefaultEncoding`, :c:var:`!Py_HasFileSystemDefaultEncoding`: - Use :c:member:`PyConfig.filesystem_encoding` or - :c:func:`PyConfig_Get("filesystem_encoding") ` instead. * :c:var:`!Py_FileSystemDefaultEncodeErrors`: Use :c:member:`PyConfig.filesystem_errors` or :c:func:`PyConfig_Get("filesystem_errors") ` instead. diff --git a/Include/fileobject.h b/Include/fileobject.h index 6a6d11409497fa..92809bfe7b90b4 100644 --- a/Include/fileobject.h +++ b/Include/fileobject.h @@ -19,11 +19,9 @@ PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *); /* The default encoding used by the platform file system APIs If non-NULL, this is different than the default encoding for strings */ -Py_DEPRECATED(3.12) PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding; #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 Py_DEPRECATED(3.12) PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors; #endif -Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding; #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_UTF8Mode; diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index e9b5fd7b0db709..9422f69ea79fba 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -690,7 +690,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): # global config DEFAULT_GLOBAL_CONFIG = { - 'Py_HasFileSystemDefaultEncoding': 0, '_Py_HasFileSystemDefaultEncodeErrors': 0, } COPY_GLOBAL_PRE_CONFIG = [ @@ -700,7 +699,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): # Copy core config to global config for expected values # True means that the core config value is inverted (0 => 1 and 1 => 0) ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), - ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), ('Py_InteractiveFlag', 'interactive'), ] diff --git a/Lib/test/test_stable_abi_ctypes.py b/Lib/test/test_stable_abi_ctypes.py index 1e6f69d49e9335..cdbd4af2cafc34 100644 --- a/Lib/test/test_stable_abi_ctypes.py +++ b/Lib/test/test_stable_abi_ctypes.py @@ -869,7 +869,6 @@ def test_windows_feature_macros(self): "Py_Exit", "Py_FatalError", "Py_FileSystemDefaultEncodeErrors", - "Py_FileSystemDefaultEncoding", "Py_Finalize", "Py_FinalizeEx", "Py_GenericAlias", @@ -889,7 +888,6 @@ def test_windows_feature_macros(self): "Py_GetPythonHome", "Py_GetRecursionLimit", "Py_GetVersion", - "Py_HasFileSystemDefaultEncoding", "Py_IncRef", "Py_Initialize", "Py_InitializeEx", diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index d3e1f0db057023..c899574ac271eb 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -1620,8 +1620,6 @@ added = '3.2' [function.Py_FatalError] added = '3.2' -[data.Py_FileSystemDefaultEncoding] - added = '3.2' [function.Py_Finalize] added = '3.2' [function.Py_GetBuildInfo] @@ -1648,8 +1646,6 @@ added = '3.2' [function.Py_GetVersion] added = '3.2' -[data.Py_HasFileSystemDefaultEncoding] - added = '3.2' [function.Py_IncRef] added = '3.2' [function.Py_Initialize] diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index eb3e1c48fd4050..fc21523b163286 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -16517,7 +16517,7 @@ init_fs_codec(PyInterpreterState *interp) PyUnicode_DecodeFSDefault() can now use the Python codec rather than the C implementation of the filesystem encoding. */ - /* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors + /* Set Py_FileSystemDefaultEncodeErrors global configuration variables. */ if (_Py_IsMainInterpreter(interp)) { diff --git a/PC/python3dll.c b/PC/python3dll.c index f0c578e11c643b..a9dfa17727b29f 100755 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -803,9 +803,7 @@ EXPORT_DATA(_PyWeakref_CallableProxyType) EXPORT_DATA(_PyWeakref_ProxyType) EXPORT_DATA(_PyWeakref_RefType) EXPORT_DATA(Py_FileSystemDefaultEncodeErrors) -EXPORT_DATA(Py_FileSystemDefaultEncoding) EXPORT_DATA(Py_GenericAliasType) -EXPORT_DATA(Py_HasFileSystemDefaultEncoding) EXPORT_DATA(Py_UTF8Mode) EXPORT_DATA(Py_Version) EXPORT_DATA(PyBaseObject_Type) diff --git a/Python/initconfig.c b/Python/initconfig.c index c2e4919f6638ab..112d3fd8dde05d 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -498,8 +498,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS #define SET_ITEM_STR(VAR) \ SET_ITEM(#VAR, FROM_STRING(VAR)) - SET_ITEM_STR(Py_FileSystemDefaultEncoding); - SET_ITEM_INT(Py_HasFileSystemDefaultEncoding); SET_ITEM_STR(Py_FileSystemDefaultEncodeErrors); SET_ITEM_INT(_Py_HasFileSystemDefaultEncodeErrors); diff --git a/Python/preconfig.c b/Python/preconfig.c index 66142b12a02c3e..08bbdbef88fe2d 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -17,8 +17,6 @@ preconfig_copy(PyPreConfig *config, const PyPreConfig *config2); /* --- File system encoding/errors -------------------------------- */ -const char *Py_FileSystemDefaultEncoding = NULL; -int Py_HasFileSystemDefaultEncoding = 0; const char *Py_FileSystemDefaultEncodeErrors = NULL; int _Py_HasFileSystemDefaultEncodeErrors = 0; @@ -27,10 +25,6 @@ _Py_ClearFileSystemEncoding(void) { _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS - if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) { - PyMem_RawFree((char*)Py_FileSystemDefaultEncoding); - Py_FileSystemDefaultEncoding = NULL; - } if (!_Py_HasFileSystemDefaultEncodeErrors && Py_FileSystemDefaultEncodeErrors) { PyMem_RawFree((char*)Py_FileSystemDefaultEncodeErrors); Py_FileSystemDefaultEncodeErrors = NULL; @@ -39,7 +33,7 @@ _Py_COMP_DIAG_POP } -/* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors +/* Set Py_FileSystemDefaultEncodeErrors global configuration variables to PyConfig.filesystem_encoding and PyConfig.filesystem_errors (encoded to UTF-8). @@ -62,9 +56,6 @@ _Py_SetFileSystemEncoding(const char *encoding, const char *errors) _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS - Py_FileSystemDefaultEncoding = encoding2; - Py_HasFileSystemDefaultEncoding = 0; - Py_FileSystemDefaultEncodeErrors = errors2; _Py_HasFileSystemDefaultEncodeErrors = 0; _Py_COMP_DIAG_POP diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index d149296fe85f13..4d3bd263ee20f8 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -102,8 +102,6 @@ Python/initconfig.c - PYPRECONFIG_SPEC - ## public C-API ## deprecated -Python/preconfig.c - Py_FileSystemDefaultEncoding - -Python/preconfig.c - Py_HasFileSystemDefaultEncoding - Python/preconfig.c - Py_FileSystemDefaultEncodeErrors - Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - From 9a322feddffc9f48080f7869ca96226333b990ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 10:04:45 +0200 Subject: [PATCH 18/28] remove `Py_FileSystemDefaultEncodeErrors` The following are also removed: - `_Py_SetFileSystemEncoding` - `_Py_ClearFileSystemEncoding` - `_Py_HasFileSystemDefaultEncodeErrors` --- Doc/data/stable_abi.dat | 1 - .../c-api-pending-removal-in-3.15.rst | 3 -- Include/fileobject.h | 7 --- Include/internal/pycore_fileutils.h | 2 - Include/internal/pycore_pylifecycle.h | 4 -- Lib/test/test_embed.py | 4 -- Lib/test/test_stable_abi_ctypes.py | 1 - Misc/stable_abi.toml | 2 - Objects/unicodeobject.c | 11 ----- PC/python3dll.c | 1 - Python/initconfig.c | 5 +- Python/preconfig.c | 48 ------------------- Python/pylifecycle.c | 1 - Tools/c-analyzer/cpython/ignored.tsv | 2 - 14 files changed, 1 insertion(+), 91 deletions(-) diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index 8186836f5ccd84..238c58d5110ac8 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -851,7 +851,6 @@ func,Py_EndInterpreter,3.2,, func,Py_EnterRecursiveCall,3.9,, func,Py_Exit,3.2,, func,Py_FatalError,3.2,, -data,Py_FileSystemDefaultEncodeErrors,3.10,, func,Py_Finalize,3.2,, func,Py_FinalizeEx,3.6,, func,Py_GenericAlias,3.9,, diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index a61fada9f0b0b4..b485955c533431 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -71,9 +71,6 @@ Pending removal in Python 3.15 * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. - * :c:var:`!Py_FileSystemDefaultEncodeErrors`: - Use :c:member:`PyConfig.filesystem_errors` or - :c:func:`PyConfig_Get("filesystem_errors") ` instead. * :c:var:`!Py_UTF8Mode`: Use :c:member:`PyPreConfig.utf8_mode` or :c:func:`PyConfig_Get("utf8_mode") ` instead. diff --git a/Include/fileobject.h b/Include/fileobject.h index 92809bfe7b90b4..4025aed9ca1ee2 100644 --- a/Include/fileobject.h +++ b/Include/fileobject.h @@ -16,13 +16,6 @@ PyAPI_FUNC(int) PyFile_WriteObject(PyObject *, PyObject *, int); PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *); PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *); -/* The default encoding used by the platform file system APIs - If non-NULL, this is different than the default encoding for strings -*/ -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 -Py_DEPRECATED(3.12) PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors; -#endif - #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_UTF8Mode; #endif diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h index 2c6d6daa01994e..471790615b5fce 100644 --- a/Include/internal/pycore_fileutils.h +++ b/Include/internal/pycore_fileutils.h @@ -190,8 +190,6 @@ extern int _Py_open_osfhandle(void *handle, int flags); ? _PyStatus_ERR("cannot decode " NAME) \ : _PyStatus_NO_MEMORY() -extern int _Py_HasFileSystemDefaultEncodeErrors; - extern int _Py_DecodeUTF8Ex( const char *arg, Py_ssize_t arglen, diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 6e89ca33e4208c..a971c8c62d444b 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -13,10 +13,6 @@ extern "C" { /* Forward declarations */ struct _PyArgv; -extern int _Py_SetFileSystemEncoding( - const char *encoding, - const char *errors); -extern void _Py_ClearFileSystemEncoding(void); extern PyStatus _PyUnicode_InitEncodings(PyThreadState *tstate); #ifdef MS_WINDOWS extern int _PyUnicode_EnableLegacyWindowsFSEncoding(void); diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 9422f69ea79fba..6af3fbb98c809d 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -689,16 +689,12 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): CONFIG_ISOLATED['legacy_windows_stdio'] = False # global config - DEFAULT_GLOBAL_CONFIG = { - '_Py_HasFileSystemDefaultEncodeErrors': 0, - } COPY_GLOBAL_PRE_CONFIG = [ ('Py_UTF8Mode', 'utf8_mode'), ] COPY_GLOBAL_CONFIG = [ # Copy core config to global config for expected values # True means that the core config value is inverted (0 => 1 and 1 => 0) - ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), ('Py_InteractiveFlag', 'interactive'), ] diff --git a/Lib/test/test_stable_abi_ctypes.py b/Lib/test/test_stable_abi_ctypes.py index cdbd4af2cafc34..927b624551c7d4 100644 --- a/Lib/test/test_stable_abi_ctypes.py +++ b/Lib/test/test_stable_abi_ctypes.py @@ -868,7 +868,6 @@ def test_windows_feature_macros(self): "Py_EnterRecursiveCall", "Py_Exit", "Py_FatalError", - "Py_FileSystemDefaultEncodeErrors", "Py_Finalize", "Py_FinalizeEx", "Py_GenericAlias", diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index c899574ac271eb..6b7813d211a2a5 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -2199,8 +2199,6 @@ added = '3.10' [function.PyModule_AddObjectRef] added = '3.10' -[data.Py_FileSystemDefaultEncodeErrors] - added = '3.10' [function.PyCodec_Unregister] added = '3.10' [function.PyErr_SetInterruptEx] diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index fc21523b163286..77ca6649cbfa3e 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -16516,17 +16516,6 @@ init_fs_codec(PyInterpreterState *interp) /* At this point, PyUnicode_EncodeFSDefault() and PyUnicode_DecodeFSDefault() can now use the Python codec rather than the C implementation of the filesystem encoding. */ - - /* Set Py_FileSystemDefaultEncodeErrors - global configuration variables. */ - if (_Py_IsMainInterpreter(interp)) { - - if (_Py_SetFileSystemEncoding(fs_codec->encoding, - fs_codec->errors) < 0) { - PyErr_NoMemory(); - return -1; - } - } return 0; } diff --git a/PC/python3dll.c b/PC/python3dll.c index a9dfa17727b29f..dd57e409e9c229 100755 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -802,7 +802,6 @@ EXPORT_DATA(_Py_TrueStruct) EXPORT_DATA(_PyWeakref_CallableProxyType) EXPORT_DATA(_PyWeakref_ProxyType) EXPORT_DATA(_PyWeakref_RefType) -EXPORT_DATA(Py_FileSystemDefaultEncodeErrors) EXPORT_DATA(Py_GenericAliasType) EXPORT_DATA(Py_UTF8Mode) EXPORT_DATA(Py_Version) diff --git a/Python/initconfig.c b/Python/initconfig.c index 112d3fd8dde05d..443ae063789758 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -1,5 +1,5 @@ #include "Python.h" -#include "pycore_fileutils.h" // _Py_HasFileSystemDefaultEncodeErrors +#include "pycore_fileutils.h" // _Py_GetLocaleEncoding() #include "pycore_getopt.h" // _PyOS_GetOpt() #include "pycore_initconfig.h" // _PyStatus_OK() #include "pycore_interp.h" // _PyInterpreterState.runtime @@ -498,9 +498,6 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS #define SET_ITEM_STR(VAR) \ SET_ITEM(#VAR, FROM_STRING(VAR)) - SET_ITEM_STR(Py_FileSystemDefaultEncodeErrors); - SET_ITEM_INT(_Py_HasFileSystemDefaultEncodeErrors); - SET_ITEM_INT(Py_UTF8Mode); SET_ITEM_INT(Py_InteractiveFlag); diff --git a/Python/preconfig.c b/Python/preconfig.c index 08bbdbef88fe2d..6ea8e7c6ea7701 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -15,54 +15,6 @@ static void preconfig_copy(PyPreConfig *config, const PyPreConfig *config2); -/* --- File system encoding/errors -------------------------------- */ - -const char *Py_FileSystemDefaultEncodeErrors = NULL; -int _Py_HasFileSystemDefaultEncodeErrors = 0; - -void -_Py_ClearFileSystemEncoding(void) -{ -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - if (!_Py_HasFileSystemDefaultEncodeErrors && Py_FileSystemDefaultEncodeErrors) { - PyMem_RawFree((char*)Py_FileSystemDefaultEncodeErrors); - Py_FileSystemDefaultEncodeErrors = NULL; - } -_Py_COMP_DIAG_POP -} - - -/* Set Py_FileSystemDefaultEncodeErrors - global configuration variables to PyConfig.filesystem_encoding and - PyConfig.filesystem_errors (encoded to UTF-8). - - Function called by _PyUnicode_InitEncodings(). */ -int -_Py_SetFileSystemEncoding(const char *encoding, const char *errors) -{ - char *encoding2 = _PyMem_RawStrdup(encoding); - if (encoding2 == NULL) { - return -1; - } - - char *errors2 = _PyMem_RawStrdup(errors); - if (errors2 == NULL) { - PyMem_RawFree(encoding2); - return -1; - } - - _Py_ClearFileSystemEncoding(); - -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - Py_FileSystemDefaultEncodeErrors = errors2; - _Py_HasFileSystemDefaultEncodeErrors = 0; -_Py_COMP_DIAG_POP - return 0; -} - - /* --- _PyArgv ---------------------------------------------------- */ /* Decode bytes_argv using Py_DecodeLocale() */ diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index c4c1d9fd9e1380..8ec976da9121fb 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1913,7 +1913,6 @@ finalize_interp_clear(PyThreadState *tstate) if (is_main_interp) { _Py_HashRandomization_Fini(); _PyArg_Fini(); - _Py_ClearFileSystemEncoding(); _PyPerfTrampoline_Fini(); _PyPerfTrampoline_FreeArenas(); } diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 4d3bd263ee20f8..975b0d2ef988f5 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -102,8 +102,6 @@ Python/initconfig.c - PYPRECONFIG_SPEC - ## public C-API ## deprecated -Python/preconfig.c - Py_FileSystemDefaultEncodeErrors - -Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - From d4ff0f7781d943257663693ece6441eb72a253a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 10:59:12 +0200 Subject: [PATCH 19/28] fix test_embed --- Lib/test/test_embed.py | 16 ++-------------- Programs/_testembed.c | 12 ------------ 2 files changed, 2 insertions(+), 26 deletions(-) diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 6af3fbb98c809d..070b30c11eb6a6 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -831,7 +831,7 @@ def check_pre_config(self, configs, expected): if value is self.IGNORE_CONFIG: pre_config.pop(key, None) del expected[key] - self.assertEqual(pre_config, expected) + self.assertDictEqual(pre_config, expected) def check_config(self, configs, expected): config = dict(configs['config']) @@ -855,7 +855,7 @@ def check_global_config(self, configs): pre_config = configs['pre_config'] config = configs['config'] - expected = dict(self.DEFAULT_GLOBAL_CONFIG) + expected = {} for item in self.COPY_GLOBAL_CONFIG: if len(item) == 3: global_key, core_key, opposite = item @@ -943,19 +943,7 @@ def test_init_global_config(self): } config = { 'program_name': './globalvar', - 'site_import': False, - 'bytes_warning': True, - 'warnoptions': ['default::BytesWarning'], - 'inspect': True, 'interactive': True, - 'optimization_level': 2, - 'write_bytecode': False, - 'verbose': True, - 'quiet': True, - 'buffered_stdio': False, - 'remote_debug': True, - 'user_site_directory': False, - 'pathconfig_warnings': False, } self.check_all_configs("test_init_global_config", config, preconfig, api=API_COMPAT) diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 368736b84cff91..9cb7e3f45c28e1 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -569,20 +569,8 @@ static int test_init_global_config(void) /* Test initialization from global configuration variables (Py_xxx) */ Py_SetProgramName(L"./globalvar"); - - putenv("PYTHONINSPECT="); - - putenv("PYTHONOPTIMIZE=0"); Py_InteractiveFlag = 1; - putenv("PYTHONDEBUG=0"); - - putenv("PYTHONDONTWRITEBYTECODE="); - - putenv("PYTHONVERBOSE=0"); - - putenv("PYTHONUNBUFFERED="); - Py_Initialize(); dump_config(); Py_Finalize(); From 5d59540031ca24bbde80882f7098d4a0aa3daa95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 12:16:15 +0200 Subject: [PATCH 20/28] blurb --- .../next/C_API/2025-05-08-12-16-11.gh-issue-133644.Zsvz26.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/C_API/2025-05-08-12-16-11.gh-issue-133644.Zsvz26.rst diff --git a/Misc/NEWS.d/next/C_API/2025-05-08-12-16-11.gh-issue-133644.Zsvz26.rst b/Misc/NEWS.d/next/C_API/2025-05-08-12-16-11.gh-issue-133644.Zsvz26.rst new file mode 100644 index 00000000000000..74c593cb17c842 --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-05-08-12-16-11.gh-issue-133644.Zsvz26.rst @@ -0,0 +1,2 @@ +Remove deprecated global configuration variables slated for removal in +Python 3.15. Patch by Bénédikt Tran From eef039e4c28d42f1cffbfeb5aaa28299621375a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 12:21:41 +0200 Subject: [PATCH 21/28] update What's New entries --- Doc/whatsnew/3.15.rst | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst index 5e9922069aa42c..907c79965735f7 100644 --- a/Doc/whatsnew/3.15.rst +++ b/Doc/whatsnew/3.15.rst @@ -155,3 +155,28 @@ Deprecated C APIs Removed C APIs -------------- +* Global configuration variables: + + * :c:var:`!Py_BytesWarningFlag` + * :c:var:`!Py_DebugFlag` + * :c:var:`!Py_DontWriteBytecodeFlag` + * :c:var:`!Py_FileSystemDefaultEncodeErrors` + * :c:var:`!Py_FileSystemDefaultEncoding` + * :c:var:`!Py_FrozenFlag` + * :c:var:`!Py_HashRandomizationFlag` + * :c:var:`!Py_HasFileSystemDefaultEncoding` + * :c:var:`!Py_IgnoreEnvironmentFlag` + * :c:var:`!Py_InspectFlag` + * :c:var:`!Py_IsolatedFlag` + * :c:var:`!Py_NoSiteFlag` + * :c:var:`!Py_NoUserSiteDirectory` + * :c:var:`!Py_OptimizeFlag` + * :c:var:`!Py_QuietFlag` + * :c:var:`!Py_UnbufferedStdioFlag` + * :c:var:`!Py_VerboseFlag` + +* Windows-only global configuration variables: + + * :c:var:`!Py_LegacyWindowsFSEncodingFlag` + * :c:var:`!Py_LegacyWindowsStdioFlag` + From 1248cea921ab146f90aea8515ec89ddd3814ce88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 12:30:58 +0200 Subject: [PATCH 22/28] update docs --- Doc/whatsnew/3.15.rst | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst index 907c79965735f7..5dc12662283251 100644 --- a/Doc/whatsnew/3.15.rst +++ b/Doc/whatsnew/3.15.rst @@ -157,26 +157,27 @@ Removed C APIs * Global configuration variables: - * :c:var:`!Py_BytesWarningFlag` - * :c:var:`!Py_DebugFlag` - * :c:var:`!Py_DontWriteBytecodeFlag` - * :c:var:`!Py_FileSystemDefaultEncodeErrors` - * :c:var:`!Py_FileSystemDefaultEncoding` - * :c:var:`!Py_FrozenFlag` - * :c:var:`!Py_HashRandomizationFlag` - * :c:var:`!Py_HasFileSystemDefaultEncoding` - * :c:var:`!Py_IgnoreEnvironmentFlag` - * :c:var:`!Py_InspectFlag` - * :c:var:`!Py_IsolatedFlag` - * :c:var:`!Py_NoSiteFlag` - * :c:var:`!Py_NoUserSiteDirectory` - * :c:var:`!Py_OptimizeFlag` - * :c:var:`!Py_QuietFlag` - * :c:var:`!Py_UnbufferedStdioFlag` - * :c:var:`!Py_VerboseFlag` + * :c:var:`!Py_BytesWarningFlag`: use :c:member:`PyConfig.bytes_warning` + * :c:var:`!Py_DebugFlag`: use :c:member:`PyConfig.parser_debug` + * :c:var:`!Py_DontWriteBytecodeFlag`: use :c:member:`PyConfig.write_bytecode` + * :c:var:`!Py_FileSystemDefaultEncodeErrors`: use :c:member:`PyConfig.filesystem_errors` + * :c:var:`!Py_FileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding` + * :c:var:`!Py_FrozenFlag`: use :c:member:`PyConfig.pathconfig_warnings` + * :c:var:`!Py_HasFileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding` + * :c:var:`!Py_HashRandomizationFlag`: use :c:member:`PyConfig.use_hash_seed` + and :c:member:`PyConfig.hash_seed` + * :c:var:`!Py_IgnoreEnvironmentFlag`: use :c:member:`PyConfig.use_environment` + * :c:var:`!Py_InspectFlag`: use :c:member:`PyConfig.inspect` + * :c:var:`!Py_IsolatedFlag`: use :c:member:`PyConfig.isolated` + * :c:var:`!Py_NoSiteFlag`: use :c:member:`PyConfig.site_import` + * :c:var:`!Py_NoUserSiteDirectory`: use :c:member:`PyConfig.user_site_directory` + * :c:var:`!Py_OptimizeFlag`: use :c:member:`PyConfig.optimization_level` + * :c:var:`!Py_QuietFlag`: use :c:member:`PyConfig.quiet` + * :c:var:`!Py_UnbufferedStdioFlag`: use :c:member:`PyConfig.buffered_stdio` + * :c:var:`!Py_VerboseFlag`: use :c:member:`PyConfig.verbose` * Windows-only global configuration variables: - * :c:var:`!Py_LegacyWindowsFSEncodingFlag` - * :c:var:`!Py_LegacyWindowsStdioFlag` + * :c:var:`!Py_LegacyWindowsFSEncodingFlag`: use :c:member:`PyPreConfig.legacy_windows_fs_encoding` + * :c:var:`!Py_LegacyWindowsStdioFlag`: use :c:member:`PyConfig.legacy_windows_stdio` From 583bafb9289f971164da6c3112e4c293094208fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 12:34:07 +0200 Subject: [PATCH 23/28] update docutils refs --- Doc/c-api/init.rst | 4 ++-- Doc/whatsnew/3.12.rst | 34 +++++++++++++++++----------------- Doc/whatsnew/3.7.rst | 4 ++-- Misc/NEWS.d/3.12.0a1.rst | 4 ++-- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 7139229dc90d07..9c9e9c5c30823f 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -94,8 +94,8 @@ and options. By default, these flags are controlled by :ref:`command line options `. When a flag is set by an option, the value of the flag is the number of times -that the option was set. For example, ``-b`` sets :c:data:`Py_BytesWarningFlag` -to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. +that the option was set. For example, ``-b`` sets :c:attr:`PyConfig.bytes_warning` +to 1 and ``-bb`` sets :c:attr:`PyConfig.bytes_warning` to 2. .. c:var:: int Py_InteractiveFlag diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index a65f59c0a72315..9772abce6d8dcf 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -2150,24 +2150,24 @@ Deprecated * Deprecate global configuration variable: - * :c:var:`Py_DebugFlag`: use :c:member:`PyConfig.parser_debug` - * :c:var:`Py_VerboseFlag`: use :c:member:`PyConfig.verbose` - * :c:var:`Py_QuietFlag`: use :c:member:`PyConfig.quiet` - * :c:var:`Py_InteractiveFlag`: use :c:member:`PyConfig.interactive` - * :c:var:`Py_InspectFlag`: use :c:member:`PyConfig.inspect` - * :c:var:`Py_OptimizeFlag`: use :c:member:`PyConfig.optimization_level` - * :c:var:`Py_NoSiteFlag`: use :c:member:`PyConfig.site_import` - * :c:var:`Py_BytesWarningFlag`: use :c:member:`PyConfig.bytes_warning` - * :c:var:`Py_FrozenFlag`: use :c:member:`PyConfig.pathconfig_warnings` - * :c:var:`Py_IgnoreEnvironmentFlag`: use :c:member:`PyConfig.use_environment` - * :c:var:`Py_DontWriteBytecodeFlag`: use :c:member:`PyConfig.write_bytecode` - * :c:var:`Py_NoUserSiteDirectory`: use :c:member:`PyConfig.user_site_directory` - * :c:var:`Py_UnbufferedStdioFlag`: use :c:member:`PyConfig.buffered_stdio` - * :c:var:`Py_HashRandomizationFlag`: use :c:member:`PyConfig.use_hash_seed` + * :c:var:`!Py_DebugFlag`: use :c:member:`PyConfig.parser_debug` + * :c:var:`!Py_VerboseFlag`: use :c:member:`PyConfig.verbose` + * :c:var:`!Py_QuietFlag`: use :c:member:`PyConfig.quiet` + * :c:var:`!Py_InteractiveFlag`: use :c:member:`PyConfig.interactive` + * :c:var:`!Py_InspectFlag`: use :c:member:`PyConfig.inspect` + * :c:var:`!Py_OptimizeFlag`: use :c:member:`PyConfig.optimization_level` + * :c:var:`!Py_NoSiteFlag`: use :c:member:`PyConfig.site_import` + * :c:var:`!Py_BytesWarningFlag`: use :c:member:`PyConfig.bytes_warning` + * :c:var:`!Py_FrozenFlag`: use :c:member:`PyConfig.pathconfig_warnings` + * :c:var:`!Py_IgnoreEnvironmentFlag`: use :c:member:`PyConfig.use_environment` + * :c:var:`!Py_DontWriteBytecodeFlag`: use :c:member:`PyConfig.write_bytecode` + * :c:var:`!Py_NoUserSiteDirectory`: use :c:member:`PyConfig.user_site_directory` + * :c:var:`!Py_UnbufferedStdioFlag`: use :c:member:`PyConfig.buffered_stdio` + * :c:var:`!Py_HashRandomizationFlag`: use :c:member:`PyConfig.use_hash_seed` and :c:member:`PyConfig.hash_seed` - * :c:var:`Py_IsolatedFlag`: use :c:member:`PyConfig.isolated` - * :c:var:`Py_LegacyWindowsFSEncodingFlag`: use :c:member:`PyPreConfig.legacy_windows_fs_encoding` - * :c:var:`Py_LegacyWindowsStdioFlag`: use :c:member:`PyConfig.legacy_windows_stdio` + * :c:var:`!Py_IsolatedFlag`: use :c:member:`PyConfig.isolated` + * :c:var:`!Py_LegacyWindowsFSEncodingFlag`: use :c:member:`PyPreConfig.legacy_windows_fs_encoding` + * :c:var:`!Py_LegacyWindowsStdioFlag`: use :c:member:`PyConfig.legacy_windows_stdio` * :c:var:`!Py_FileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding` * :c:var:`!Py_HasFileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding` * :c:var:`!Py_FileSystemDefaultEncodeErrors`: use :c:member:`PyConfig.filesystem_errors` diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index f420fa5c04479b..4d651125411a65 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -2517,7 +2517,7 @@ number of other issues). Some known details affected: over the default filters set by the interpreter Due to changes in the way the default warnings filters are configured, -setting :c:data:`Py_BytesWarningFlag` to a value greater than one is no longer +setting :c:data:`!Py_BytesWarningFlag` to a value greater than one is no longer sufficient to both emit :exc:`BytesWarning` messages and have them converted to exceptions. Instead, the flag must be set (to cause the warnings to be emitted in the first place), and an explicit ``error::BytesWarning`` @@ -2540,7 +2540,7 @@ Starting in 3.7.1, :c:func:`Py_Initialize` now consistently reads and respects all of the same environment settings as :c:func:`Py_Main` (in earlier Python versions, it respected an ill-defined subset of those environment variables, while in Python 3.7.0 it didn't read any of them due to :issue:`34247`). If -this behavior is unwanted, set :c:data:`Py_IgnoreEnvironmentFlag` to 1 before +this behavior is unwanted, set :c:data:`!Py_IgnoreEnvironmentFlag` to 1 before calling :c:func:`Py_Initialize`. In 3.7.1 the C API for Context Variables diff --git a/Misc/NEWS.d/3.12.0a1.rst b/Misc/NEWS.d/3.12.0a1.rst index f2668e99a6299b..d3471181818b6d 100644 --- a/Misc/NEWS.d/3.12.0a1.rst +++ b/Misc/NEWS.d/3.12.0a1.rst @@ -6089,7 +6089,7 @@ Patch by Serge Guelton. .. section: C API Deprecate global configuration variables, like -:c:var:`Py_IgnoreEnvironmentFlag`, in the documentation: the +:c:var:`!Py_IgnoreEnvironmentFlag`, in the documentation: the :c:func:`Py_InitializeFromConfig` API should be instead. Patch by Victor Stinner. @@ -6101,7 +6101,7 @@ Stinner. .. section: C API Deprecate global configuration variable like -:c:var:`Py_IgnoreEnvironmentFlag`: the :c:func:`Py_InitializeFromConfig` API +:c:var:`!Py_IgnoreEnvironmentFlag`: the :c:func:`Py_InitializeFromConfig` API should be instead. Patch by Victor Stinner. .. From daa1e2d5ea7bfeff34ecf2d88435fc113dbd2db3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 12:44:15 +0200 Subject: [PATCH 24/28] fixup --- Doc/c-api/init.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 9c9e9c5c30823f..4b1b86b4251968 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -94,8 +94,8 @@ and options. By default, these flags are controlled by :ref:`command line options `. When a flag is set by an option, the value of the flag is the number of times -that the option was set. For example, ``-b`` sets :c:attr:`PyConfig.bytes_warning` -to 1 and ``-bb`` sets :c:attr:`PyConfig.bytes_warning` to 2. +that the option was set. For example, ``-b`` sets :c:member:`PyConfig.bytes_warning` +to 1 and ``-bb`` sets :c:member:`PyConfig.bytes_warning` to 2. .. c:var:: int Py_InteractiveFlag From 6c7baa285416433e6c9b52ade2d8fc3115338fad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 13:36:20 +0200 Subject: [PATCH 25/28] revert `putenv` statements --- Programs/_testembed.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 9cb7e3f45c28e1..e46cacf219ea82 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -569,7 +569,14 @@ static int test_init_global_config(void) /* Test initialization from global configuration variables (Py_xxx) */ Py_SetProgramName(L"./globalvar"); + + putenv("PYTHONINSPECT="); + putenv("PYTHONOPTIMIZE=0"); Py_InteractiveFlag = 1; + putenv("PYTHONDEBUG=0"); + putenv("PYTHONDONTWRITEBYTECODE="); + putenv("PYTHONVERBOSE=0"); + putenv("PYTHONUNBUFFERED="); Py_Initialize(); dump_config(); From d9f4def6f424a09586c917aa0d8738d446d699be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 13:41:49 +0200 Subject: [PATCH 26/28] restore file --- .../c-api-pending-removal-in-3.15.rst | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst index b485955c533431..74f8a9e8ce3656 100644 --- a/Doc/deprecations/c-api-pending-removal-in-3.15.rst +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -68,9 +68,64 @@ Pending removal in Python 3.15 * Global configuration variables: + * :c:var:`!Py_DebugFlag`: + Use :c:member:`PyConfig.parser_debug` or + :c:func:`PyConfig_Get("parser_debug") ` instead. + * :c:var:`!Py_VerboseFlag`: + Use :c:member:`PyConfig.verbose` or + :c:func:`PyConfig_Get("verbose") ` instead. + * :c:var:`!Py_QuietFlag`: + Use :c:member:`PyConfig.quiet` or + :c:func:`PyConfig_Get("quiet") ` instead. * :c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or :c:func:`PyConfig_Get("interactive") ` instead. + * :c:var:`!Py_InspectFlag`: + Use :c:member:`PyConfig.inspect` or + :c:func:`PyConfig_Get("inspect") ` instead. + * :c:var:`!Py_OptimizeFlag`: + Use :c:member:`PyConfig.optimization_level` or + :c:func:`PyConfig_Get("optimization_level") ` instead. + * :c:var:`!Py_NoSiteFlag`: + Use :c:member:`PyConfig.site_import` or + :c:func:`PyConfig_Get("site_import") ` instead. + * :c:var:`!Py_BytesWarningFlag`: + Use :c:member:`PyConfig.bytes_warning` or + :c:func:`PyConfig_Get("bytes_warning") ` instead. + * :c:var:`!Py_FrozenFlag`: + Use :c:member:`PyConfig.pathconfig_warnings` or + :c:func:`PyConfig_Get("pathconfig_warnings") ` instead. + * :c:var:`!Py_IgnoreEnvironmentFlag`: + Use :c:member:`PyConfig.use_environment` or + :c:func:`PyConfig_Get("use_environment") ` instead. + * :c:var:`!Py_DontWriteBytecodeFlag`: + Use :c:member:`PyConfig.write_bytecode` or + :c:func:`PyConfig_Get("write_bytecode") ` instead. + * :c:var:`!Py_NoUserSiteDirectory`: + Use :c:member:`PyConfig.user_site_directory` or + :c:func:`PyConfig_Get("user_site_directory") ` instead. + * :c:var:`!Py_UnbufferedStdioFlag`: + Use :c:member:`PyConfig.buffered_stdio` or + :c:func:`PyConfig_Get("buffered_stdio") ` instead. + * :c:var:`!Py_HashRandomizationFlag`: + Use :c:member:`PyConfig.use_hash_seed` + and :c:member:`PyConfig.hash_seed` or + :c:func:`PyConfig_Get("hash_seed") ` instead. + * :c:var:`!Py_IsolatedFlag`: + Use :c:member:`PyConfig.isolated` or + :c:func:`PyConfig_Get("isolated") ` instead. + * :c:var:`!Py_LegacyWindowsFSEncodingFlag`: + Use :c:member:`PyPreConfig.legacy_windows_fs_encoding` or + :c:func:`PyConfig_Get("legacy_windows_fs_encoding") ` instead. + * :c:var:`!Py_LegacyWindowsStdioFlag`: + Use :c:member:`PyConfig.legacy_windows_stdio` or + :c:func:`PyConfig_Get("legacy_windows_stdio") ` instead. + * :c:var:`!Py_FileSystemDefaultEncoding`, :c:var:`!Py_HasFileSystemDefaultEncoding`: + Use :c:member:`PyConfig.filesystem_encoding` or + :c:func:`PyConfig_Get("filesystem_encoding") ` instead. + * :c:var:`!Py_FileSystemDefaultEncodeErrors`: + Use :c:member:`PyConfig.filesystem_errors` or + :c:func:`PyConfig_Get("filesystem_errors") ` instead. * :c:var:`!Py_UTF8Mode`: Use :c:member:`PyPreConfig.utf8_mode` or :c:func:`PyConfig_Get("utf8_mode") ` instead. From 279ac003c49af4ed223def53325af77a0feadc42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 14:48:52 +0200 Subject: [PATCH 27/28] update stable ABI symbols --- Lib/test/test_stable_abi_ctypes.py | 3 +++ Misc/stable_abi.toml | 9 +++++++++ PC/python3dll.c | 3 +++ 3 files changed, 15 insertions(+) diff --git a/Lib/test/test_stable_abi_ctypes.py b/Lib/test/test_stable_abi_ctypes.py index 927b624551c7d4..1e6f69d49e9335 100644 --- a/Lib/test/test_stable_abi_ctypes.py +++ b/Lib/test/test_stable_abi_ctypes.py @@ -868,6 +868,8 @@ def test_windows_feature_macros(self): "Py_EnterRecursiveCall", "Py_Exit", "Py_FatalError", + "Py_FileSystemDefaultEncodeErrors", + "Py_FileSystemDefaultEncoding", "Py_Finalize", "Py_FinalizeEx", "Py_GenericAlias", @@ -887,6 +889,7 @@ def test_windows_feature_macros(self): "Py_GetPythonHome", "Py_GetRecursionLimit", "Py_GetVersion", + "Py_HasFileSystemDefaultEncoding", "Py_IncRef", "Py_Initialize", "Py_InitializeEx", diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index 6b7813d211a2a5..5755c67d5765d3 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -1620,6 +1620,9 @@ added = '3.2' [function.Py_FatalError] added = '3.2' +[data.Py_FileSystemDefaultEncoding] + added = '3.2' + abi_only = true [function.Py_Finalize] added = '3.2' [function.Py_GetBuildInfo] @@ -1646,6 +1649,9 @@ added = '3.2' [function.Py_GetVersion] added = '3.2' +[data.Py_HasFileSystemDefaultEncoding] + added = '3.2' + abi_only = true [function.Py_IncRef] added = '3.2' [function.Py_Initialize] @@ -2199,6 +2205,9 @@ added = '3.10' [function.PyModule_AddObjectRef] added = '3.10' +[data.Py_FileSystemDefaultEncodeErrors] + added = '3.10' + abi_only = true [function.PyCodec_Unregister] added = '3.10' [function.PyErr_SetInterruptEx] diff --git a/PC/python3dll.c b/PC/python3dll.c index dd57e409e9c229..f0c578e11c643b 100755 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -802,7 +802,10 @@ EXPORT_DATA(_Py_TrueStruct) EXPORT_DATA(_PyWeakref_CallableProxyType) EXPORT_DATA(_PyWeakref_ProxyType) EXPORT_DATA(_PyWeakref_RefType) +EXPORT_DATA(Py_FileSystemDefaultEncodeErrors) +EXPORT_DATA(Py_FileSystemDefaultEncoding) EXPORT_DATA(Py_GenericAliasType) +EXPORT_DATA(Py_HasFileSystemDefaultEncoding) EXPORT_DATA(Py_UTF8Mode) EXPORT_DATA(Py_Version) EXPORT_DATA(PyBaseObject_Type) From cddebbeee651a6e4aa3e02a46f0761094a7907ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 8 May 2025 14:55:42 +0200 Subject: [PATCH 28/28] revert runtime changes for now --- Doc/data/stable_abi.dat | 3 + Include/cpython/initconfig.h | 9 +- Include/cpython/pydebug.h | 21 ++++- Include/fileobject.h | 9 ++ Include/internal/pycore_fileutils.h | 2 + Include/internal/pycore_pylifecycle.h | 4 + Lib/test/test_ctypes/test_values.py | 7 ++ Lib/test/test_embed.py | 43 ++++++++- Lib/test/test_utf8_mode.py | 2 +- Misc/stable_abi.toml | 3 - Modules/main.c | 4 + Objects/unicodeobject.c | 11 +++ Programs/_testembed.c | 72 +++++++++++++++ Python/initconfig.c | 128 ++++++++++++++++++++------ Python/preconfig.c | 69 +++++++++++++- Python/pylifecycle.c | 1 + Python/sysmodule.c | 12 +-- Tools/c-analyzer/cpython/ignored.tsv | 20 ++++ Tools/freeze/makefreeze.py | 5 +- 19 files changed, 373 insertions(+), 52 deletions(-) diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index 238c58d5110ac8..3d68487d07baf2 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -851,6 +851,8 @@ func,Py_EndInterpreter,3.2,, func,Py_EnterRecursiveCall,3.9,, func,Py_Exit,3.2,, func,Py_FatalError,3.2,, +data,Py_FileSystemDefaultEncodeErrors,3.10,, +data,Py_FileSystemDefaultEncoding,3.2,, func,Py_Finalize,3.2,, func,Py_FinalizeEx,3.6,, func,Py_GenericAlias,3.9,, @@ -869,6 +871,7 @@ func,Py_GetProgramName,3.2,, func,Py_GetPythonHome,3.2,, func,Py_GetRecursionLimit,3.2,, func,Py_GetVersion,3.2,, +data,Py_HasFileSystemDefaultEncoding,3.2,, func,Py_IncRef,3.2,, func,Py_Initialize,3.2,, func,Py_InitializeEx,3.2,, diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 9b854ed7bcce20..7ce4acfeb7177d 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -54,11 +54,13 @@ typedef struct PyPreConfig { /* If greater than 0, enable isolated mode: sys.path contains neither the script's directory nor the user's site-packages directory. - Set to 1 by the -I command line option. */ + Set to 1 by the -I command line option. If set to -1 (default), inherit + Py_IsolatedFlag value. */ int isolated; /* If greater than 0: use environment variables. - Set to 0 by -E command line option. */ + Set to 0 by -E command line option. If set to -1 (default), it is + set to !Py_IgnoreEnvironmentFlag. */ int use_environment; /* Set the LC_CTYPE locale to the user preferred locale? If equals to 0, @@ -91,7 +93,8 @@ typedef struct PyPreConfig { encoding for the filesystem encoding. Set to 1 if the PYTHONLEGACYWINDOWSFSENCODING environment variable is - set to a non-empty string. + set to a non-empty string. If set to -1 (default), inherit + Py_LegacyWindowsFSEncodingFlag value. See PEP 529 for more details. */ int legacy_windows_fs_encoding; diff --git a/Include/cpython/pydebug.h b/Include/cpython/pydebug.h index 43b8049a969ac7..f6ebd99ed7e2ff 100644 --- a/Include/cpython/pydebug.h +++ b/Include/cpython/pydebug.h @@ -5,10 +5,29 @@ extern "C" { #endif +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_DebugFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_VerboseFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_QuietFlag; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InspectFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_OptimizeFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoSiteFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_BytesWarningFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_FrozenFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_DontWriteBytecodeFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoUserSiteDirectory; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_UnbufferedStdioFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_HashRandomizationFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IsolatedFlag; + +#ifdef MS_WINDOWS +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_LegacyWindowsFSEncodingFlag; +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_LegacyWindowsStdioFlag; +#endif /* this is a wrapper around getenv() that pays attention to - PyConfig.use_environment. It should be used for getting variables like + Py_IgnoreEnvironmentFlag. It should be used for getting variables like PYTHONPATH and PYTHONHOME from the environment */ PyAPI_FUNC(char*) Py_GETENV(const char *name); diff --git a/Include/fileobject.h b/Include/fileobject.h index 4025aed9ca1ee2..6a6d11409497fa 100644 --- a/Include/fileobject.h +++ b/Include/fileobject.h @@ -16,6 +16,15 @@ PyAPI_FUNC(int) PyFile_WriteObject(PyObject *, PyObject *, int); PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *); PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *); +/* The default encoding used by the platform file system APIs + If non-NULL, this is different than the default encoding for strings +*/ +Py_DEPRECATED(3.12) PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +Py_DEPRECATED(3.12) PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors; +#endif +Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding; + #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_UTF8Mode; #endif diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h index 471790615b5fce..2c6d6daa01994e 100644 --- a/Include/internal/pycore_fileutils.h +++ b/Include/internal/pycore_fileutils.h @@ -190,6 +190,8 @@ extern int _Py_open_osfhandle(void *handle, int flags); ? _PyStatus_ERR("cannot decode " NAME) \ : _PyStatus_NO_MEMORY() +extern int _Py_HasFileSystemDefaultEncodeErrors; + extern int _Py_DecodeUTF8Ex( const char *arg, Py_ssize_t arglen, diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index a971c8c62d444b..6e89ca33e4208c 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -13,6 +13,10 @@ extern "C" { /* Forward declarations */ struct _PyArgv; +extern int _Py_SetFileSystemEncoding( + const char *encoding, + const char *errors); +extern void _Py_ClearFileSystemEncoding(void); extern PyStatus _PyUnicode_InitEncodings(PyThreadState *tstate); #ifdef MS_WINDOWS extern int _PyUnicode_EnableLegacyWindowsFSEncoding(void); diff --git a/Lib/test/test_ctypes/test_values.py b/Lib/test/test_ctypes/test_values.py index e0bf2e66d0a8f2..8d1ee25ace5479 100644 --- a/Lib/test/test_ctypes/test_values.py +++ b/Lib/test/test_ctypes/test_values.py @@ -39,6 +39,13 @@ def test_undefined(self): class PythonValuesTestCase(unittest.TestCase): """This test only works when python itself is a dll/shared library""" + def test_optimizeflag(self): + # This test accesses the Py_OptimizeFlag integer, which is + # exported by the Python dll and should match the sys.flags value + + opt = c_int.in_dll(pythonapi, "Py_OptimizeFlag").value + self.assertEqual(opt, sys.flags.optimize) + @thread_unsafe('overrides frozen modules') def test_frozentable(self): # Python exports a PyImport_FrozenModules symbol. This is a diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 070b30c11eb6a6..95b2d80464c349 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -689,14 +689,41 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): CONFIG_ISOLATED['legacy_windows_stdio'] = False # global config + DEFAULT_GLOBAL_CONFIG = { + 'Py_HasFileSystemDefaultEncoding': 0, + 'Py_HashRandomizationFlag': 1, + '_Py_HasFileSystemDefaultEncodeErrors': 0, + } COPY_GLOBAL_PRE_CONFIG = [ ('Py_UTF8Mode', 'utf8_mode'), ] COPY_GLOBAL_CONFIG = [ # Copy core config to global config for expected values # True means that the core config value is inverted (0 => 1 and 1 => 0) + ('Py_BytesWarningFlag', 'bytes_warning'), + ('Py_DebugFlag', 'parser_debug'), + ('Py_DontWriteBytecodeFlag', 'write_bytecode', True), + ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), + ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), + ('Py_FrozenFlag', 'pathconfig_warnings', True), + ('Py_IgnoreEnvironmentFlag', 'use_environment', True), + ('Py_InspectFlag', 'inspect'), ('Py_InteractiveFlag', 'interactive'), + ('Py_IsolatedFlag', 'isolated'), + ('Py_NoSiteFlag', 'site_import', True), + ('Py_NoUserSiteDirectory', 'user_site_directory', True), + ('Py_OptimizeFlag', 'optimization_level'), + ('Py_QuietFlag', 'quiet'), + ('Py_UnbufferedStdioFlag', 'buffered_stdio', True), + ('Py_VerboseFlag', 'verbose'), ] + if MS_WINDOWS: + COPY_GLOBAL_PRE_CONFIG.extend(( + ('Py_LegacyWindowsFSEncodingFlag', 'legacy_windows_fs_encoding'), + )) + COPY_GLOBAL_CONFIG.extend(( + ('Py_LegacyWindowsStdioFlag', 'legacy_windows_stdio'), + )) EXPECTED_CONFIG = None @@ -831,7 +858,7 @@ def check_pre_config(self, configs, expected): if value is self.IGNORE_CONFIG: pre_config.pop(key, None) del expected[key] - self.assertDictEqual(pre_config, expected) + self.assertEqual(pre_config, expected) def check_config(self, configs, expected): config = dict(configs['config']) @@ -855,7 +882,7 @@ def check_global_config(self, configs): pre_config = configs['pre_config'] config = configs['config'] - expected = {} + expected = dict(self.DEFAULT_GLOBAL_CONFIG) for item in self.COPY_GLOBAL_CONFIG: if len(item) == 3: global_key, core_key, opposite = item @@ -943,7 +970,19 @@ def test_init_global_config(self): } config = { 'program_name': './globalvar', + 'site_import': False, + 'bytes_warning': True, + 'warnoptions': ['default::BytesWarning'], + 'inspect': True, 'interactive': True, + 'optimization_level': 2, + 'write_bytecode': False, + 'verbose': True, + 'quiet': True, + 'buffered_stdio': False, + 'remote_debug': True, + 'user_site_directory': False, + 'pathconfig_warnings': False, } self.check_all_configs("test_init_global_config", config, preconfig, api=API_COMPAT) diff --git a/Lib/test/test_utf8_mode.py b/Lib/test/test_utf8_mode.py index bcbf641fc612c3..f66881044e16df 100644 --- a/Lib/test/test_utf8_mode.py +++ b/Lib/test/test_utf8_mode.py @@ -237,7 +237,7 @@ def check(utf8_opt, expected, **kw): check('utf8=0', [c_arg], LC_ALL=loc) def test_optim_level(self): - # CPython: check that Py_Main() doesn't increment PyConfig.optimize + # CPython: check that Py_Main() doesn't increment Py_OptimizeFlag # twice when -X utf8 requires to parse the configuration twice (when # the encoding changes after reading the configuration, the # configuration is read again with the new encoding). diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index 5755c67d5765d3..d3e1f0db057023 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -1622,7 +1622,6 @@ added = '3.2' [data.Py_FileSystemDefaultEncoding] added = '3.2' - abi_only = true [function.Py_Finalize] added = '3.2' [function.Py_GetBuildInfo] @@ -1651,7 +1650,6 @@ added = '3.2' [data.Py_HasFileSystemDefaultEncoding] added = '3.2' - abi_only = true [function.Py_IncRef] added = '3.2' [function.Py_Initialize] @@ -2207,7 +2205,6 @@ added = '3.10' [data.Py_FileSystemDefaultEncodeErrors] added = '3.10' - abi_only = true [function.PyCodec_Unregister] added = '3.10' [function.PyErr_SetInterruptEx] diff --git a/Modules/main.c b/Modules/main.c index 12671085732937..ea1239ecc57f00 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -523,6 +523,10 @@ static void pymain_set_inspect(PyConfig *config, int inspect) { config->inspect = inspect; +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS + Py_InspectFlag = inspect; +_Py_COMP_DIAG_POP } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 77ca6649cbfa3e..eb3e1c48fd4050 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -16516,6 +16516,17 @@ init_fs_codec(PyInterpreterState *interp) /* At this point, PyUnicode_EncodeFSDefault() and PyUnicode_DecodeFSDefault() can now use the Python codec rather than the C implementation of the filesystem encoding. */ + + /* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors + global configuration variables. */ + if (_Py_IsMainInterpreter(interp)) { + + if (_Py_SetFileSystemEncoding(fs_codec->encoding, + fs_codec->errors) < 0) { + PyErr_NoMemory(); + return -1; + } + } return 0; } diff --git a/Programs/_testembed.c b/Programs/_testembed.c index e46cacf219ea82..8a7412c7019e60 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -564,19 +564,45 @@ static int test_init_compat_config(void) static int test_init_global_config(void) { + /* FIXME: test Py_IgnoreEnvironmentFlag */ + putenv("PYTHONUTF8=0"); Py_UTF8Mode = 1; /* Test initialization from global configuration variables (Py_xxx) */ Py_SetProgramName(L"./globalvar"); + /* Py_IsolatedFlag is not tested */ + Py_NoSiteFlag = 1; + Py_BytesWarningFlag = 1; + putenv("PYTHONINSPECT="); + Py_InspectFlag = 1; + putenv("PYTHONOPTIMIZE=0"); Py_InteractiveFlag = 1; + putenv("PYTHONDEBUG=0"); + Py_OptimizeFlag = 2; + + /* Py_DebugFlag is not tested */ + putenv("PYTHONDONTWRITEBYTECODE="); + Py_DontWriteBytecodeFlag = 1; + putenv("PYTHONVERBOSE=0"); + Py_VerboseFlag = 1; + + Py_QuietFlag = 1; + Py_NoUserSiteDirectory = 1; + putenv("PYTHONUNBUFFERED="); + Py_UnbufferedStdioFlag = 1; + + Py_FrozenFlag = 1; + + /* FIXME: test Py_LegacyWindowsFSEncodingFlag */ + /* FIXME: test Py_LegacyWindowsStdioFlag */ Py_Initialize(); dump_config(); @@ -678,31 +704,39 @@ static int test_init_from_config(void) config_set_string(&config, &config.platlibdir, L"my_platlibdir"); putenv("PYTHONVERBOSE=0"); + Py_VerboseFlag = 0; config.verbose = 1; + Py_NoSiteFlag = 0; config.site_import = 0; + Py_BytesWarningFlag = 0; config.bytes_warning = 1; putenv("PYTHONINSPECT="); + Py_InspectFlag = 0; config.inspect = 1; Py_InteractiveFlag = 0; config.interactive = 1; putenv("PYTHONOPTIMIZE=0"); + Py_OptimizeFlag = 1; config.optimization_level = 2; /* FIXME: test parser_debug */ putenv("PYTHONDONTWRITEBYTECODE="); + Py_DontWriteBytecodeFlag = 0; config.write_bytecode = 0; + Py_QuietFlag = 0; config.quiet = 1; config.configure_c_stdio = 1; putenv("PYTHONUNBUFFERED="); + Py_UnbufferedStdioFlag = 0; config.buffered_stdio = 0; putenv("PYTHONIOENCODING=cp424"); @@ -710,10 +744,12 @@ static int test_init_from_config(void) config_set_string(&config, &config.stdio_errors, L"replace"); putenv("PYTHONNOUSERSITE="); + Py_NoUserSiteDirectory = 0; config.user_site_directory = 0; config_set_string(&config, &config.check_hash_pycs_mode, L"always"); + Py_FrozenFlag = 0; config.pathconfig_warnings = 0; config.safe_path = 1; @@ -815,6 +851,7 @@ static void set_all_env_vars(void) static int test_init_compat_env(void) { /* Test initialization from environment variables */ + Py_IgnoreEnvironmentFlag = 0; set_all_env_vars(); _testembed_Py_InitializeFromConfig(); dump_config(); @@ -850,6 +887,7 @@ static void set_all_env_vars_dev_mode(void) static int test_init_env_dev_mode(void) { /* Test initialization from environment variables */ + Py_IgnoreEnvironmentFlag = 0; set_all_env_vars_dev_mode(); _testembed_Py_InitializeFromConfig(); dump_config(); @@ -861,6 +899,7 @@ static int test_init_env_dev_mode(void) static int test_init_env_dev_mode_alloc(void) { /* Test initialization from environment variables */ + Py_IgnoreEnvironmentFlag = 0; set_all_env_vars_dev_mode(); #ifndef Py_GIL_DISABLED putenv("PYTHONMALLOC=malloc"); @@ -880,6 +919,7 @@ static int test_init_isolated_flag(void) PyConfig config; PyConfig_InitPythonConfig(&config); + Py_IsolatedFlag = 0; config.isolated = 1; // These options are set to 1 by isolated=1 config.safe_path = 0; @@ -939,6 +979,7 @@ static int test_preinit_isolated2(void) PyConfig config; _PyConfig_InitCompatConfig(&config); + Py_IsolatedFlag = 0; config.isolated = 1; config_set_program_name(&config); @@ -1011,7 +1052,23 @@ static int test_preinit_parse_argv(void) static void set_all_global_config_variables(void) { + Py_IsolatedFlag = 0; + Py_IgnoreEnvironmentFlag = 0; + Py_BytesWarningFlag = 2; + Py_InspectFlag = 1; Py_InteractiveFlag = 1; + Py_OptimizeFlag = 1; + Py_DebugFlag = 1; + Py_VerboseFlag = 1; + Py_QuietFlag = 1; + Py_FrozenFlag = 0; + Py_UnbufferedStdioFlag = 1; + Py_NoSiteFlag = 1; + Py_DontWriteBytecodeFlag = 1; + Py_NoUserSiteDirectory = 1; +#ifdef MS_WINDOWS + Py_LegacyWindowsStdioFlag = 1; +#endif } @@ -1072,6 +1129,16 @@ static int check_init_python_config(int preinit) { /* global configuration variables must be ignored */ set_all_global_config_variables(); + Py_IsolatedFlag = 1; + Py_IgnoreEnvironmentFlag = 1; + Py_FrozenFlag = 1; + Py_UnbufferedStdioFlag = 1; + Py_NoSiteFlag = 1; + Py_DontWriteBytecodeFlag = 1; + Py_NoUserSiteDirectory = 1; +#ifdef MS_WINDOWS + Py_LegacyWindowsStdioFlag = 1; +#endif if (preinit) { PyPreConfig preconfig; @@ -1178,6 +1245,7 @@ static int test_open_code_hook(void) return 2; } + Py_IgnoreEnvironmentFlag = 0; _testembed_Py_InitializeFromConfig(); result = 0; @@ -1240,6 +1308,7 @@ static int _test_audit(Py_ssize_t setValue) { Py_ssize_t sawSet = 0; + Py_IgnoreEnvironmentFlag = 0; PySys_AddAuditHook(_audit_hook, &sawSet); _testembed_Py_InitializeFromConfig(); @@ -1351,6 +1420,7 @@ static int _audit_subinterpreter_hook(const char *event, PyObject *args, void *u static int test_audit_subinterpreter(void) { + Py_IgnoreEnvironmentFlag = 0; PySys_AddAuditHook(_audit_subinterpreter_hook, NULL); _testembed_Py_InitializeFromConfig(); @@ -1397,6 +1467,7 @@ static int test_audit_run_command(void) AuditRunCommandTest test = {"cpython.run_command"}; wchar_t *argv[] = {PROGRAM_NAME, L"-c", L"pass"}; + Py_IgnoreEnvironmentFlag = 0; PySys_AddAuditHook(_audit_hook_run, (void*)&test); return Py_Main(Py_ARRAY_LENGTH(argv), argv); @@ -1407,6 +1478,7 @@ static int test_audit_run_file(void) AuditRunCommandTest test = {"cpython.run_file"}; wchar_t *argv[] = {PROGRAM_NAME, L"filename.py"}; + Py_IgnoreEnvironmentFlag = 0; PySys_AddAuditHook(_audit_hook_run, (void*)&test); return Py_Main(Py_ARRAY_LENGTH(argv), argv); diff --git a/Python/initconfig.c b/Python/initconfig.c index 443ae063789758..e827091172162e 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -1,5 +1,5 @@ #include "Python.h" -#include "pycore_fileutils.h" // _Py_GetLocaleEncoding() +#include "pycore_fileutils.h" // _Py_HasFileSystemDefaultEncodeErrors #include "pycore_getopt.h" // _PyOS_GetOpt() #include "pycore_initconfig.h" // _PyStatus_OK() #include "pycore_interp.h" // _PyInterpreterState.runtime @@ -462,7 +462,25 @@ static const char usage_envvars[] = /* UTF-8 mode (PEP 540): if equals to 1, use the UTF-8 encoding, and change stdin and stdout error handler to "surrogateescape". */ int Py_UTF8Mode = 0; +int Py_DebugFlag = 0; /* Needed by parser.c */ +int Py_VerboseFlag = 0; /* Needed by import.c */ +int Py_QuietFlag = 0; /* Needed by sysmodule.c */ int Py_InteractiveFlag = 0; /* Previously, was used by Py_FdIsInteractive() */ +int Py_InspectFlag = 0; /* Needed to determine whether to exit at SystemExit */ +int Py_OptimizeFlag = 0; /* Needed by compile.c */ +int Py_NoSiteFlag = 0; /* Suppress 'import site' */ +int Py_BytesWarningFlag = 0; /* Warn on str(bytes) and str(buffer) */ +int Py_FrozenFlag = 0; /* Needed by getpath.c */ +int Py_IgnoreEnvironmentFlag = 0; /* e.g. PYTHONPATH, PYTHONHOME */ +int Py_DontWriteBytecodeFlag = 0; /* Suppress writing bytecode files (*.pyc) */ +int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ +int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */ +int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ +int Py_IsolatedFlag = 0; /* for -I, isolate from user's env */ +#ifdef MS_WINDOWS +int Py_LegacyWindowsFSEncodingFlag = 0; /* Uses mbcs instead of utf-8 */ +int Py_LegacyWindowsStdioFlag = 0; /* Uses FileIO instead of WindowsConsoleIO */ +#endif static PyObject * @@ -498,8 +516,33 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS #define SET_ITEM_STR(VAR) \ SET_ITEM(#VAR, FROM_STRING(VAR)) + SET_ITEM_STR(Py_FileSystemDefaultEncoding); + SET_ITEM_INT(Py_HasFileSystemDefaultEncoding); + SET_ITEM_STR(Py_FileSystemDefaultEncodeErrors); + SET_ITEM_INT(_Py_HasFileSystemDefaultEncodeErrors); + SET_ITEM_INT(Py_UTF8Mode); + SET_ITEM_INT(Py_DebugFlag); + SET_ITEM_INT(Py_VerboseFlag); + SET_ITEM_INT(Py_QuietFlag); SET_ITEM_INT(Py_InteractiveFlag); + SET_ITEM_INT(Py_InspectFlag); + + SET_ITEM_INT(Py_OptimizeFlag); + SET_ITEM_INT(Py_NoSiteFlag); + SET_ITEM_INT(Py_BytesWarningFlag); + SET_ITEM_INT(Py_FrozenFlag); + SET_ITEM_INT(Py_IgnoreEnvironmentFlag); + SET_ITEM_INT(Py_DontWriteBytecodeFlag); + SET_ITEM_INT(Py_NoUserSiteDirectory); + SET_ITEM_INT(Py_UnbufferedStdioFlag); + SET_ITEM_INT(Py_HashRandomizationFlag); + SET_ITEM_INT(Py_IsolatedFlag); + +#ifdef MS_WINDOWS + SET_ITEM_INT(Py_LegacyWindowsFSEncodingFlag); + SET_ITEM_INT(Py_LegacyWindowsStdioFlag); +#endif return dict; @@ -517,22 +560,13 @@ _Py_COMP_DIAG_POP char* Py_GETENV(const char *name) { - if (!_PyRuntime.core_initialized) { - // During pre-initialization, we cannot hold the GIL so we directly - // read from '_PyRuntime.preconfig' instead as it's not yet possible - // to change the 'use_environment' field. - return _PyRuntime.preconfig.use_environment ? getenv(name) : NULL; - } - PyGILState_STATE state = PyGILState_Ensure(); - PyObject *p_use_environment = PyConfig_Get("use_environment"); - PyGILState_Release(state); - if (p_use_environment == NULL) { - PyErr_Clear(); +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS + if (Py_IgnoreEnvironmentFlag) { return NULL; } - bool use_environment = Py_IsTrue(p_use_environment); - Py_DECREF(p_use_environment); - return use_environment ? getenv(name) : NULL; + return getenv(name); +_Py_COMP_DIAG_POP } /* --- PyStatus ----------------------------------------------- */ @@ -973,7 +1007,7 @@ _PyConfig_InitCompatConfig(PyConfig *config) config->_config_init = (int)_PyConfig_INIT_COMPAT; config->import_time = -1; config->isolated = -1; - config->use_environment = 1; + config->use_environment = -1; config->dev_mode = -1; config->install_signal_handlers = 1; config->use_hash_seed = -1; @@ -983,25 +1017,25 @@ _PyConfig_InitCompatConfig(PyConfig *config) config->remote_debug = -1; config->module_search_paths_set = 0; config->parse_argv = 0; - config->site_import = 1; - config->bytes_warning = 0; + config->site_import = -1; + config->bytes_warning = -1; config->warn_default_encoding = 0; - config->inspect = 0; + config->inspect = -1; config->interactive = -1; - config->optimization_level = 0; - config->parser_debug = 0; - config->write_bytecode = 1; - config->verbose = 0; - config->quiet = 0; - config->user_site_directory = 1; + config->optimization_level = -1; + config->parser_debug= -1; + config->write_bytecode = -1; + config->verbose = -1; + config->quiet = -1; + config->user_site_directory = -1; config->configure_c_stdio = 0; - config->buffered_stdio = 1; + config->buffered_stdio = -1; config->_install_importlib = 1; config->check_hash_pycs_mode = NULL; - config->pathconfig_warnings = 1; + config->pathconfig_warnings = -1; config->_init_main = 1; #ifdef MS_WINDOWS - config->legacy_windows_stdio = 0; + config->legacy_windows_stdio = -1; #endif #ifdef Py_DEBUG config->use_frozen_modules = 0; @@ -1638,7 +1672,24 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS config->ATTR = !(VALUE); \ } + COPY_FLAG(isolated, Py_IsolatedFlag); + COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); + COPY_FLAG(bytes_warning, Py_BytesWarningFlag); + COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); + COPY_FLAG(optimization_level, Py_OptimizeFlag); + COPY_FLAG(parser_debug, Py_DebugFlag); + COPY_FLAG(verbose, Py_VerboseFlag); + COPY_FLAG(quiet, Py_QuietFlag); +#ifdef MS_WINDOWS + COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); +#endif + COPY_NOT_FLAG(pathconfig_warnings, Py_FrozenFlag); + + COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); + COPY_NOT_FLAG(site_import, Py_NoSiteFlag); + COPY_NOT_FLAG(write_bytecode, Py_DontWriteBytecodeFlag); + COPY_NOT_FLAG(user_site_directory, Py_NoUserSiteDirectory); #undef COPY_FLAG #undef COPY_NOT_FLAG @@ -1661,7 +1712,28 @@ _Py_COMP_DIAG_IGNORE_DEPR_DECLS VAR = !config->ATTR; \ } + COPY_FLAG(isolated, Py_IsolatedFlag); + COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); + COPY_FLAG(bytes_warning, Py_BytesWarningFlag); + COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(interactive, Py_InteractiveFlag); + COPY_FLAG(optimization_level, Py_OptimizeFlag); + COPY_FLAG(parser_debug, Py_DebugFlag); + COPY_FLAG(verbose, Py_VerboseFlag); + COPY_FLAG(quiet, Py_QuietFlag); +#ifdef MS_WINDOWS + COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); +#endif + COPY_NOT_FLAG(pathconfig_warnings, Py_FrozenFlag); + + COPY_NOT_FLAG(buffered_stdio, Py_UnbufferedStdioFlag); + COPY_NOT_FLAG(site_import, Py_NoSiteFlag); + COPY_NOT_FLAG(write_bytecode, Py_DontWriteBytecodeFlag); + COPY_NOT_FLAG(user_site_directory, Py_NoUserSiteDirectory); + + /* Random or non-zero hash seed */ + Py_HashRandomizationFlag = (config->use_hash_seed == 0 || + config->hash_seed != 0); #undef COPY_FLAG #undef COPY_NOT_FLAG diff --git a/Python/preconfig.c b/Python/preconfig.c index 6ea8e7c6ea7701..5b26c75de8b3a0 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -15,6 +15,63 @@ static void preconfig_copy(PyPreConfig *config, const PyPreConfig *config2); +/* --- File system encoding/errors -------------------------------- */ + +const char *Py_FileSystemDefaultEncoding = NULL; +int Py_HasFileSystemDefaultEncoding = 0; +const char *Py_FileSystemDefaultEncodeErrors = NULL; +int _Py_HasFileSystemDefaultEncodeErrors = 0; + +void +_Py_ClearFileSystemEncoding(void) +{ +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS + if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) { + PyMem_RawFree((char*)Py_FileSystemDefaultEncoding); + Py_FileSystemDefaultEncoding = NULL; + } + if (!_Py_HasFileSystemDefaultEncodeErrors && Py_FileSystemDefaultEncodeErrors) { + PyMem_RawFree((char*)Py_FileSystemDefaultEncodeErrors); + Py_FileSystemDefaultEncodeErrors = NULL; + } +_Py_COMP_DIAG_POP +} + + +/* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors + global configuration variables to PyConfig.filesystem_encoding and + PyConfig.filesystem_errors (encoded to UTF-8). + + Function called by _PyUnicode_InitEncodings(). */ +int +_Py_SetFileSystemEncoding(const char *encoding, const char *errors) +{ + char *encoding2 = _PyMem_RawStrdup(encoding); + if (encoding2 == NULL) { + return -1; + } + + char *errors2 = _PyMem_RawStrdup(errors); + if (errors2 == NULL) { + PyMem_RawFree(encoding2); + return -1; + } + + _Py_ClearFileSystemEncoding(); + +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS + Py_FileSystemDefaultEncoding = encoding2; + Py_HasFileSystemDefaultEncoding = 0; + + Py_FileSystemDefaultEncodeErrors = errors2; + _Py_HasFileSystemDefaultEncodeErrors = 0; +_Py_COMP_DIAG_POP + return 0; +} + + /* --- _PyArgv ---------------------------------------------------- */ /* Decode bytes_argv using Py_DecodeLocale() */ @@ -230,7 +287,7 @@ _PyPreConfig_InitCompatConfig(PyPreConfig *config) config->_config_init = (int)_PyConfig_INIT_COMPAT; config->parse_argv = 0; - config->isolated = 0; + config->isolated = -1; config->use_environment = -1; config->configure_locale = 1; @@ -424,9 +481,14 @@ preconfig_get_global_vars(PyPreConfig *config) _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS + COPY_FLAG(isolated, Py_IsolatedFlag); + COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); if (Py_UTF8Mode > 0) { config->utf8_mode = Py_UTF8Mode; } +#ifdef MS_WINDOWS + COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); +#endif _Py_COMP_DIAG_POP #undef COPY_FLAG @@ -448,6 +510,11 @@ preconfig_set_global_vars(const PyPreConfig *config) _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS + COPY_FLAG(isolated, Py_IsolatedFlag); + COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); +#ifdef MS_WINDOWS + COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); +#endif COPY_FLAG(utf8_mode, Py_UTF8Mode); _Py_COMP_DIAG_POP diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 8ec976da9121fb..c4c1d9fd9e1380 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1913,6 +1913,7 @@ finalize_interp_clear(PyThreadState *tstate) if (is_main_interp) { _Py_HashRandomization_Fini(); _PyArg_Fini(); + _Py_ClearFileSystemEncoding(); _PyPerfTrampoline_Fini(); _PyPerfTrampoline_FreeArenas(); } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 0de2e352656486..00dce4527fbb90 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -4266,19 +4266,9 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) void PySys_SetArgv(int argc, wchar_t **argv) { - PyGILState_STATE state = PyGILState_Ensure(); - PyObject *isolated = PyConfig_Get("isolated"); - PyGILState_Release(state); - if (isolated == NULL) { - PyErr_Clear(); - Py_FatalError("cannot retrieve PyConfig.isolated"); - return; - } - bool updatepath = Py_IsFalse(isolated); - Py_DECREF(isolated); _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS - PySys_SetArgvEx(argc, argv, updatepath); + PySys_SetArgvEx(argc, argv, Py_IsolatedFlag == 0); _Py_COMP_DIAG_POP } diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 975b0d2ef988f5..b128abca39fb41 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -102,10 +102,30 @@ Python/initconfig.c - PYPRECONFIG_SPEC - ## public C-API ## deprecated +Python/preconfig.c - Py_FileSystemDefaultEncoding - +Python/preconfig.c - Py_HasFileSystemDefaultEncoding - +Python/preconfig.c - Py_FileSystemDefaultEncodeErrors - +Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors - ## legacy config flags Python/initconfig.c - Py_UTF8Mode - +Python/initconfig.c - Py_DebugFlag - +Python/initconfig.c - Py_VerboseFlag - +Python/initconfig.c - Py_QuietFlag - Python/initconfig.c - Py_InteractiveFlag - +Python/initconfig.c - Py_InspectFlag - +Python/initconfig.c - Py_OptimizeFlag - +Python/initconfig.c - Py_NoSiteFlag - +Python/initconfig.c - Py_BytesWarningFlag - +Python/initconfig.c - Py_FrozenFlag - +Python/initconfig.c - Py_IgnoreEnvironmentFlag - +Python/initconfig.c - Py_DontWriteBytecodeFlag - +Python/initconfig.c - Py_NoUserSiteDirectory - +Python/initconfig.c - Py_UnbufferedStdioFlag - +Python/initconfig.c - Py_HashRandomizationFlag - +Python/initconfig.c - Py_IsolatedFlag - +Python/initconfig.c - Py_LegacyWindowsFSEncodingFlag - +Python/initconfig.c - Py_LegacyWindowsStdioFlag - ##----------------------- ## initialized statically, may be customized by embedders diff --git a/Tools/freeze/makefreeze.py b/Tools/freeze/makefreeze.py index ba5734b950a974..c464f4bbb2655d 100644 --- a/Tools/freeze/makefreeze.py +++ b/Tools/freeze/makefreeze.py @@ -14,18 +14,19 @@ }; """ -# if __debug__ == 0 (i.e. -O option given), set PyConfig.optimize in frozen app. +# if __debug__ == 0 (i.e. -O option given), set Py_OptimizeFlag in frozen app. default_entry_point = """ int main(int argc, char **argv) { extern int Py_FrozenMain(int, char **); """ + ((not __debug__ and """ - putenv("PYTHONOPTIMIZE", "1"); + Py_OptimizeFlag++; """) or "") + """ PyImport_FrozenModules = _PyImport_FrozenModules; return Py_FrozenMain(argc, argv); } + """ def makefreeze(base, dict, debug=0, entry_point=None, fail_import=()):