8000 gh-111374: Add a new PYTHON_FROZEN_MODULES env var, equivalent of `-X frozen_modules`. by yilei · Pull Request #111411 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

gh-111374: Add a new PYTHON_FROZEN_MODULES env var, equivalent of -X frozen_modules. #111411

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
Nov 1, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 20 additions & 5 deletions Doc/using/cmdline.rst
Original file line number Diff line number Diff line change
Expand Up @@ -535,12 +535,13 @@ Miscellaneous options
location indicators when the interpreter displays tracebacks. See also
:envvar:`PYTHONNODEBUGRANGES`.
* ``-X frozen_modules`` determines whether or not frozen modules are
ignored by the import machinery. A value of "on" means they get
imported and "off" means they are ignored. The default is "on"
ignored by the import machinery. A value of ``on`` means they get
imported and ``off`` means they are ignored. The default is ``on``
if this is an installed Python (the normal case). If it's under
development (running from the source tree) then the default is "off".
Note that the "importlib_bootstrap" and "importlib_bootstrap_external"
frozen modules are always used, even if this flag is set to "off".
development (running from the source tree) then the default is ``off``.
Note that the :mod:`!importlib_bootstrap` and
:mod:`!importlib_bootstrap_external` frozen modules are always used, even
if this flag is set to ``off``. See also :envvar:`PYTHON_FROZEN_MODULES`.
* ``-X perf`` enables support for the Linux ``perf`` profiler.
When this option is provided, the ``perf`` profiler will be able to
report Python calls. This option is only available on some platforms and
Expand Down Expand Up @@ -1091,6 +1092,20 @@ conflict.

.. versionadded:: 3.13

.. envvar:: PYTHON_FROZEN_MODULES

If this variable is set to ``on`` or ``off``, it determines whether or not
frozen modules are ignored by the import machinery. A value of ``on`` means
they get imported and ``off`` means they are ignored. The default is ``on``
for non-debug builds (the normal case) and ``off`` for debug builds.
Note that the :mod:`!importlib_bootstrap` and
:mod:`!importlib_bootstrap_external` frozen modules are always used, even
if this flag is set to ``off``.

See also the :option:`-X frozen_modules <-X>` command-line option.

.. versionadded:: 3.13


Debug-mode variables
~~~~~~~~~~~~~~~~~~~~
Expand Down
5 changes: 5 additions & 0 deletions Doc/whatsnew/3.13.rst
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ Other Language Changes
is rejected when the global is used in the :keyword:`else` block.
(Contributed by Irit Katriel in :gh:`111123`.)

* Added a new environment variable :envvar:`PYTHON_FROZEN_MODULES`. It
determines whether or not frozen modules are ignored by the import machinery,
equivalent of the :option:`-X frozen_modules <-X>` command-line option.
(Contributed by Yilei Yang in :gh:`111374`.)

New Modules
===========

Expand Down
11 changes: 11 additions & 0 deletions Lib/test/test_cmd_line.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,17 @@ def test_xoption_frozen_modules(self):
res = assert_python_ok(*cmd)
self.assertRegex(res.out.decode('utf-8'), expected)

def test_env_var_frozen_modules(self):
tests = {
('on', 'FrozenImporter'),
('off', 'SourceFileLoader'),
}
for raw, expected in tests:
cmd = ['-c', 'import os; print(os.__spec__.loader, end="")']
with self.subTest(raw):
res = assert_python_ok(*cmd, PYTHON_FROZEN_MODULES=raw)
self.assertRegex(res.out.decode('utf-8'), expected)

def test_run_module(self):
# Test expected operation of the '-m' switch
# Switch needs an argument
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Added a new environment variable :envvar:`PYTHON_FROZEN_MODULES`. It
determines whether or not frozen modules are ignored by the import machinery,
equivalent of the :option:`-X frozen_modules <-X>` command-line option.
18 changes: 17 additions & 1 deletion Python/initconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -285,11 +285,14 @@ static const char usage_envvars[] =
"PYTHONDEVMODE: enable the development mode.\n"
"PYTHONPYCACHEPREFIX: root directory for bytecode cache (pyc) files.\n"
"PYTHONWARNDEFAULTENCODING: enable opt-in EncodingWarning for 'encoding=None'.\n"
"PYTHONNODEBUGRANGES: If this variable is set, it disables the inclusion of the \n"
"PYTHONNODEBUGRANGES: if this variable is set, it disables the inclusion of the \n"
" tables mapping extra location information (end line, start column offset \n"
" and end column offset) to every instruction in code objects. This is useful \n"
" when smaller code objects and pyc files are desired as well as suppressing the \n"
" extra visual location indicators when the interpreter displays tracebacks.\n"
"PYTHON_FROZEN_MODULES : if this variable is set, it determines whether or not \n"
" frozen modules should be used. The default is \"on\" (or \"off\" if you are \n"
" running a local build).\n"
"These variables have equivalent command-line parameters (see --help for details):\n"
"PYTHONDEBUG : enable parser debug mode (-d)\n"
"PYTHONDONTWRITEBYTECODE : don't write .pyc files (-B)\n"
Expand Down Expand Up @@ -2132,6 +2135,19 @@ config_init_import(PyConfig *config, int compute_path_config)
return status;
}

const char *env = config_get_env(config, "PYTHON_FROZEN_MODULES");
if (env == NULL) {
}
else if (strcmp(env, "on") == 0) {
config->use_frozen_modules = 1;
}
else if (strcmp(env, "off") == 0) {
config->use_frozen_modules = 0;
} else {
return PyStatus_Error("bad value for PYTHON_FROZEN_MODULES "
"(expected \"on\" or \"off\")");
}

/* -X frozen_modules=[on|off] */
const wchar_t *value = config_get_xoption_value(config, L"frozen_modules");
if (value == NULL) {
Expand Down
0