Skip to content

Commit 42c3e9c

Browse files
Do not import rlcompleter in complete* methods
1 parent f467382 commit 42c3e9c

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

Lib/pdb.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,15 @@ def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
363363
readline.set_completer_delims(' \t\n`@#%^&*()=+[{]}\\|;:\'",<>?')
364364
except ImportError:
365365
pass
366+
367+
# GH-138860
368+
# We need to lazy-import rlcompleter to avoid deadlock
369+
# We cannot import it during self.complete* methods because importing
370+
# rlcompleter for the first time will overwrite readline's completer
371+
# So we import it here and save the Completer class
372+
from rlcompleter import Completer
373+
self.RlCompleter = Completer
374+
366375
self.allow_kbdint = False
367376
self.nosigint = nosigint
368377
# Consider these characters as part of the command so when the users type
@@ -1185,13 +1194,9 @@ def completedefault(self, text, line, begidx, endidx):
11851194
conv_vars = self.curframe.f_globals.get('__pdb_convenience_variables', {})
11861195
return [f"${name}" for name in conv_vars if name.startswith(text[1:])]
11871196

1188-
# Use rlcompleter to do the completion
1189-
# GH-138860
1190-
# This needs to be lazy-imported to avoid deadlock
1191-
from rlcompleter import Completer
11921197
state = 0
11931198
matches = []
1194-
completer = Completer(self.curframe.f_globals | self.curframe.f_locals)
1199+
completer = self.RlCompleter(self.curframe.f_globals | self.curframe.f_locals)
11951200
while (match := completer.complete(text, state)) is not None:
11961201
matches.append(match)
11971202
state += 1
@@ -1206,11 +1211,8 @@ def _enable_rlcompleter(self, ns):
12061211
return
12071212

12081213
try:
1214+
completer = self.RlCompleter(ns)
12091215
old_completer = readline.get_completer()
1210-
# GH-138860
1211-
# This needs to be lazy-imported to avoid deadlock
1212-
from rlcompleter import Completer
1213-
completer = Completer(ns)
12141216
readline.set_completer(completer.complete)
12151217
yield
12161218
finally:
@@ -3155,6 +3157,7 @@ def read_command(self, prompt):
31553157
def readline_completion(self, completer):
31563158
try:
31573159
import readline
3160+
import rlcompleter
31583161
except ImportError:
31593162
yield
31603163
return

0 commit comments

Comments
 (0)