Bug report
Bug description:
Problem summary
Starting in Python 3.13, Lib/pdb.py contains a top-level from rlcompleter import Completer, which indirectly causes a top-level import readline, which deadlocks waiting to access stdin if pdb is imported directly or indirectly in a subprocess launched with either process_group=0 or preexec_fn=setpgrp.
Proposed change
- Remove top-level
from rlcompleter import CompleterfromLib/pdb.py. - Lazy import it by adding
from rlcompleter import Completerto the beginnings ofcompletedefaultand_enable_rl_complete
History and Details
python/cpythonPR 112950, released in Python 3.13, added thefrom rlcompleter import CompletertoLib/pdb.py. There was no top-level indirect import ofreadlinebefore this.- This only impacts
import readlinewhen it's backed by GNUlibreadline. Notably, the Mac default Python installation useslibeditinstead, so on Macs this can only be reproduced by usingcondaorpyenvwith a separately downloaded copy of Python 3.13.
Rationale
- Any code that directly or indirectly imports
pdbends up importingreadline, potentially causing a deadlock, even if the caller never actually intends to usepdb.- Specifically, pytorch (
import torch) imports pdb, and this caused import torch hangs when running in subprocess with preexec_fn=os.setpgrp, python >=3.13, conda env pytorch/pytorch#159645
- Specifically, pytorch (
- Notably, all direct cases of
import readlineinLib/pdb.pyare already lazy, so this is a an established pattern that was broken by the top-levelrlcompleterimport.
Full writeup
This issue focuses on the pdb part of the problem.
Here's a comprehensive cross-functional writeup about the issue: https://github.com/kelu-wandb/public-demo/tree/main/pgrp-torch-pdb-readline
CPython versions tested on:
3.13
Operating systems tested on:
macOS