[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 c8624cd367)
This commit is contained in:
Tian Gao 2025-09-24 14:07:50 +08:00 committed by GitHub
parent 096772dd5d
commit dbe4690772
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 11 additions and 3 deletions

View file

@ -90,7 +90,6 @@ import linecache
import _colorize
from contextlib import contextmanager
from rlcompleter import Completer
from types import CodeType
@ -332,6 +331,15 @@ class Pdb(bdb.Bdb, cmd.Cmd):
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 @@ class Pdb(bdb.Bdb, cmd.Cmd):
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

View file

@ -0,0 +1 @@
Lazy import :mod:`rlcompleter` in :mod:`pdb` to avoid deadlock in subprocess.