100100import _pyrepl .utils
101101
102102from contextlib import ExitStack , closing , contextmanager
103- from rlcompleter import Completer
104103from types import CodeType
105104from warnings import deprecated
106105
@@ -364,6 +363,15 @@ def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
364363 readline .set_completer_delims (' \t \n `@#%^&*()=+[{]}\\ |;:\' ",<>?' )
365364 except ImportError :
366365 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+
367375 self .allow_kbdint = False
368376 self .nosigint = nosigint
369377 # Consider these characters as part of the command so when the users type
@@ -1186,10 +1194,9 @@ def completedefault(self, text, line, begidx, endidx):
11861194 conv_vars = self .curframe .f_globals .get ('__pdb_convenience_variables' , {})
11871195 return [f"${ name } " for name in conv_vars if name .startswith (text [1 :])]
11881196
1189- # Use rlcompleter to do the completion
11901197 state = 0
11911198 matches = []
1192- completer = Completer (self .curframe .f_globals | self .curframe .f_locals )
1199+ completer = self . RlCompleter (self .curframe .f_globals | self .curframe .f_locals )
11931200 while (match := completer .complete (text , state )) is not None :
11941201 matches .append (match )
11951202 state += 1
@@ -1204,8 +1211,8 @@ def _enable_rlcompleter(self, ns):
12041211 return
12051212
12061213 try :
1214+ completer = self .RlCompleter (ns )
12071215 old_completer = readline .get_completer ()
1208- completer = Completer (ns )
12091216 readline .set_completer (completer .complete )
12101217 yield
12111218 finally :
0 commit comments