gh-92345: Import rlcompleter before sys.path is extended (#92346)

``pymain_run_python()`` now imports ``readline`` and ``rlcompleter``
before sys.path is extended to include the current working directory of
an interactive interpreter. Non-interactive interpreters are not
affected.

Also move imports of ``re`` and ``keyword`` module to top level so they
are materialized early, too. The ``keyword`` module is trivial and the
``re`` is already imported via ``inspect`` -> ``linecache``.
This commit is contained in:
Christian Heimes 2022-05-05 21:24:16 +02:00 committed by GitHub
parent 1ed8d035f1
commit 8122e8d501
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 3 deletions

View file

@ -32,6 +32,8 @@
import atexit
import builtins
import inspect
import keyword
import re
import __main__
__all__ = ["Completer"]
@ -113,7 +115,6 @@ def global_matches(self, text):
defined in self.namespace that match.
"""
import keyword
matches = []
seen = {"__builtins__"}
n = len(text)
@ -146,7 +147,6 @@ def attr_matches(self, text):
with a __getattr__ hook is evaluated.
"""
import re
m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text)
if not m:
return []

View file

@ -0,0 +1,3 @@
``pymain_run_python()`` now imports ``readline`` and ``rlcompleter`` before
sys.path is extended to include the current working directory of an
interactive interpreter. Non-interactive interpreters are not affected.

View file

@ -219,6 +219,13 @@ pymain_import_readline(const PyConfig *config)
else {
Py_DECREF(mod);
}
mod = PyImport_ImportModule("rlcompleter");
if (mod == NULL) {
PyErr_Clear();
}
else {
Py_DECREF(mod);
}
}
@ -555,6 +562,9 @@ pymain_run_python(int *exitcode)
}
}
// import readline and rlcompleter before script dir is added to sys.path
pymain_import_readline(config);
if (main_importer_path != NULL) {
if (pymain_sys_path_add_path0(interp, main_importer_path) < 0) {
goto error;
@ -577,7 +587,6 @@ pymain_run_python(int *exitcode)
}
pymain_header(config);
pymain_import_readline(config);
if (config->run_command) {
*exitcode = pymain_run_command(config->run_command);