Skip to content

Commit dbe4690

Browse files
[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 c8624cd)
1 parent 096772d commit dbe4690

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

Lib/pdb.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@
9090
import _colorize
9191

9292
from contextlib import contextmanager
93-
from rlcompleter import Completer
9493
from types import CodeType
9594

9695

@@ -332,6 +331,15 @@ def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
332331
readline.set_completer_delims(' \t\n`@#%^&*()=+[{]}\\|;:\'",<>?')
333332
except ImportError:
334333
pass
334+
335+
# GH-138860
336+
# We need to lazy-import rlcompleter to avoid deadlock
337+
# We cannot import it during self.complete* methods because importing
338+
# rlcompleter for the first time will overwrite readline's completer
339+
# So we import it here and save the Completer class
340+
from rlcompleter import Completer
341+
self.RlCompleter = Completer
342+
335343
self.allow_kbdint = False
336344
self.nosigint = nosigint
337345
# Consider these characters as part of the command so when the users type
@@ -986,10 +994,9 @@ def completedefault(self, text, line, begidx, endidx):
986994
conv_vars = self.curframe.f_globals.get('__pdb_convenience_variables', {})
987995
return [f"${name}" for name in conv_vars if name.startswith(text[1:])]
988996

989-
# Use rlcompleter to do the completion
990997
state = 0
991998
matches = []
992-
completer = Completer(self.curframe.f_globals | self.curframe_locals)
999+
completer = self.RlCompleter(self.curframe.f_globals | self.curframe.f_locals)
9931000
while (match := completer.complete(text, state)) is not None:
9941001
matches.append(match)
9951002
state += 1
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Lazy import :mod:`rlcompleter` in :mod:`pdb` to avoid deadlock in subprocess.

0 commit comments

Comments
 (0)