https://github.com/python/cpython/commit/dbe4690772b366e1014469ad32fe866276768a44
commit: dbe4690772b366e1014469ad32fe866276768a44
branch: 3.13
author: Tian Gao <[email protected]>
committer: gaogaotiantian <[email protected]>
date: 2025-09-24T14:07:50+08:00
summary:

[3.13] gh-138860: Lazy import rlcompleter in pdb to avoid deadlock in… (#139281)

[3.13] gh-138860: Lazy import rlcompleter in pdb to avoid deadlock in 
subprocess (GH-139185)
(cherry picked from commit c8624cd36746b17d8f991cde63705e9419e940de)

files:
A Misc/NEWS.d/next/Library/2025-09-20-17-50-31.gh-issue-138860.Y9JXap.rst
M Lib/pdb.py

diff --git a/Lib/pdb.py b/Lib/pdb.py
index cb0a3405c58e55..41735f4e249f5d 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -90,7 +90,6 @@
 import _colorize
 
 from contextlib import contextmanager
-from rlcompleter import Completer
 from types import CodeType
 
 
@@ -332,6 +331,15 @@ def __init__(self, completekey='tab', stdin=None, 
stdout=None, skip=None,
             readline.set_completer_delims(' \t\n`@#%^&*()=+[{]}\\|;:\'",<>?')
         except ImportError:
             pass
+
+        # GH-138860
+        # We need to lazy-import rlcompleter to avoid deadlock
+        # We cannot import it during self.complete* methods because importing
+        # rlcompleter for the first time will overwrite readline's completer
+        # So we import it here and save the Completer class
+        from rlcompleter import Completer
+        self.RlCompleter = Completer
+
         self.allow_kbdint = False
         self.nosigint = nosigint
         # Consider these characters as part of the command so when the users 
type
@@ -986,10 +994,9 @@ def completedefault(self, text, line, begidx, endidx):
             conv_vars = 
self.curframe.f_globals.get('__pdb_convenience_variables', {})
             return [f"${name}" for name in conv_vars if 
name.startswith(text[1:])]
 
-        # Use rlcompleter to do the completion
         state = 0
         matches = []
-        completer = Completer(self.curframe.f_globals | self.curframe_locals)
+        completer = self.RlCompleter(self.curframe.f_globals | 
self.curframe.f_locals)
         while (match := completer.complete(text, state)) is not None:
             matches.append(match)
             state += 1
diff --git 
a/Misc/NEWS.d/next/Library/2025-09-20-17-50-31.gh-issue-138860.Y9JXap.rst 
b/Misc/NEWS.d/next/Library/2025-09-20-17-50-31.gh-issue-138860.Y9JXap.rst
new file mode 100644
index 00000000000000..0903eb71ae4346
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-09-20-17-50-31.gh-issue-138860.Y9JXap.rst
@@ -0,0 +1 @@
+Lazy import :mod:`rlcompleter` in :mod:`pdb` to avoid deadlock in subprocess.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to