@@ -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