summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Heimes <christian@python.org>2022-05-05 19:24:16 (GMT)
committerGitHub <noreply@github.com>2022-05-05 19:24:16 (GMT)
commit8122e8d5017be9f0683a49bc20d3c82e8b5398d6 (patch)
tree4072244bc4219c6cc02d5919af62b0c4aa0c96d2
parent1ed8d035f1edfaec34016b9f8d615df9e9fe9414 (diff)
downloadcpython-8122e8d5017be9f0683a49bc20d3c82e8b5398d6.zip
cpython-8122e8d5017be9f0683a49bc20d3c82e8b5398d6.tar.gz
cpython-8122e8d5017be9f0683a49bc20d3c82e8b5398d6.tar.bz2
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``.
-rw-r--r--Lib/rlcompleter.py4
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-05-05-20-05-41.gh-issue-92345.lnN_RA.rst3
-rw-r--r--Modules/main.c11
3 files changed, 15 insertions, 3 deletions
diff --git a/Lib/rlcompleter.py b/Lib/rlcompleter.py
index 4ede6dc..206d6fb 100644
--- a/Lib/rlcompleter.py
+++ b/Lib/rlcompleter.py
@@ -32,6 +32,8 @@ Notes:
import atexit
import builtins
import inspect
+import keyword
+import re
import __main__
__all__ = ["Completer"]
@@ -113,7 +115,6 @@ class Completer:
defined in self.namespace that match.
"""
- import keyword
matches = []
seen = {"__builtins__"}
n = len(text)
@@ -146,7 +147,6 @@ class Completer:
with a __getattr__ hook is evaluated.
"""
- import re
m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text)
if not m:
return []
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-05-20-05-41.gh-issue-92345.lnN_RA.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-05-20-05-41.gh-issue-92345.lnN_RA.rst
new file mode 100644
index 0000000..2e2a608
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-05-20-05-41.gh-issue-92345.lnN_RA.rst
@@ -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.
diff --git a/Modules/main.c b/Modules/main.c
index 2443f56..624c0f3 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -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);