@@ -709,6 +709,27 @@ def _get_asyncio_task(self):
709709 task = None
710710 return task
711711
712+ def _get_pid_from_process (self , process ):
713+ """process could be a subprocess.Popen, multiprocessing.Process or a pid
714+ """
715+ # They are not used elsewhere so do a lazy import
716+ from multiprocessing import Process
717+ from subprocess import Popen
718+
719+ try :
720+ process = self ._getval (process )
721+ except :
722+ # Error message is already displayed
723+ return None
724+
725+ if isinstance (process , (Process , Popen )):
726+ return process .pid
727+ elif isinstance (process , int ):
728+ return process
729+
730+ self .error (f"Invalid process { process } " )
731+ return None
732+
712733 def interaction (self , frame , tb_or_exc ):
713734 # Restore the previous signal handler at the Pdb prompt.
714735 if Pdb ._previous_sigint_handler :
@@ -1967,32 +1988,16 @@ def do_attach(self, process):
19671988 Attach to process, which can be a subprocess.Popen,
19681989 multiprocessing.Process or a pid.
19691990 """
1970- import multiprocessing
1971- import subprocess
1972-
1973- try :
1974- process = self ._getval (process )
1975- except :
1976- # Error message is already displayed
1977- return
1991+ pid = self ._get_pid_from_process (process )
19781992
1979- if isinstance (process , subprocess .Popen ):
1980- pid = process .pid
1981- elif isinstance (process , multiprocessing .Process ):
1982- pid = process .pid
1983- elif isinstance (process , int ):
1984- pid = process
1985- else :
1986- self .error ("Invalid process: %s" % process )
1987- return
1988-
1989- self .message (f"Attaching to process { pid } " )
1990- try :
1991- attach (pid )
1992- except Exception as e :
1993- self ._error_exc ()
1994- return
1995- self .message (f"Detached from process { pid } " )
1993+ if pid is not None :
1994+ self .message (f"Attaching to process { pid } " )
1995+ try :
1996+ attach (pid )
1997+ except Exception as e :
1998+ self ._error_exc ()
1999+ return
2000+ self .message (f"Detached from process { pid } " )
19962001
19972002 def do_quit (self , arg ):
19982003 """q(uit) | exit
@@ -2961,26 +2966,9 @@ def detach(self):
29612966 pass
29622967
29632968 def do_attach (self , process ):
2964- import multiprocessing
2965- import subprocess
2966-
2967- try :
2968- process = self ._getval (process )
2969- except :
2970- # Error message is already displayed
2971- return
2972-
2973- if isinstance (process , subprocess .Popen ):
2974- pid = process .pid
2975- elif isinstance (process , multiprocessing .Process ):
2976- pid = process .pid
2977- elif isinstance (process , int ):
2978- pid = process
2979- else :
2980- self .error ("Invalid process: %s" % process )
2981- return
2982-
2983- self ._send (attach = pid )
2969+ pid = self ._get_pid_from_process (process )
2970+ if pid is not None :
2971+ self ._send (attach = pid )
29842972
29852973 def do_debug (self , arg ):
29862974 # Clear our cached list of valid commands; the recursive debugger might
0 commit comments