
    Je                     N    d Z ddlZddlZddlmZ ddlZddlmZ  G d de      Zy)zKernel Manager subclass.    N)run_sync)QtKernelManagerc                       e Zd ZdZd Zeej                  dddfd       Zd
de	ddfdZ
 ee
      Zd
de	ddfd	Z ee      Zy)SpyderKernelManagerak  
    Spyder kernels that live in a conda environment are now properly activated
    with custom activation scripts located at plugins/ipythonconsole/scripts.

    However, on windows the batch script is terminated but not the kernel it
    started so this subclass overrides the `_kill_kernel` method to properly
    kill the started kernels by using psutil.
    c                 B    d| _         t        j                  | g|i |S )NF)shutting_downr   __init__)selfargskwargss      M/usr/lib/python3/dist-packages/spyder/plugins/ipythonconsole/utils/manager.pyr	   zSpyderKernelManager.__init__   s%    "''>t>v>>    TNc                   K   | t        j                         k7  sJ 	 t        j                  |       }|j                  d      }|r|j                  |       |D ]  }	 |j                  |        t        j                  |||      \  }}	||	fS # t        j                  $ r g g fcY S w xY w# t        j                  t        j                  f$ r	 g g fcY c S w xY ww)a,  
        Kill a process tree (including grandchildren) with sig and return a
        (gone, still_alive) tuple.

        "on_terminate", if specified, is a callabck function which is called
        as soon as a child terminates.

        This is an new method not present in QtKernelManager.
        T)	recursive)timeoutcallback)
osgetpidpsutilProcessNoSuchProcesschildrenappendsend_signalAccessDenied
wait_procs)
pidsiginclude_parentr   on_terminateparentr   child_processgonealives
             r   kill_proc_treez"SpyderKernelManager.kill_proc_tree#   s      biik!!!
	^^C(F ??T?2OOF#% 	 M ))#.	  ''!
e e}7 ## 	8O	$ '')=)=>  Bx sK   CB *CB,.!CB)&C(B))C,'CCCCrestartreturnc                 "  K   | j                   r| j                  J | j                  | j                  j                  j                         d{    | j                  j                  |       d{    ddl}	 |j                  | j                         d       d{    | j                   r#| j                  j                          d{    yyy7 7 e7 97 # |j                  $ r | j                  j                  d       Y yw xY ww)zKill the running kernel.
        Override private method of jupyter_client 7 to be able to correctly
        close kernel that was started via a batch/bash script for correct conda
        env activation.
        N)r&   r   g      @)r   z>Wait for final termination of kernel timed out - continuing...)
has_kernelprovisionerr%   processr   killasynciowait_for_async_waitwaitTimeoutErrorlogwarning)r
   r&   r-   s      r   _async_kill_kernelz&SpyderKernelManager._async_kill_kernelS   s     ??##/// %%d&6&6&>&>&B&BCCC""'''888 2&&t'7'7'93&GGG ??**//111 #+ 
 D8
 H 2 ''     "8 9sl   ADC#D3C4D=$C !C"C &)DCDDC D*D	DDDc                    K   | j                   rF| j                  J | j                  | j                  j                  j                         d{    yy7 w)zIsimilar to _kill_kernel, but with sigterm (not sigkill), but do not blockN)r)   r*   r%   r+   r   )r
   r&   s     r   _async_send_kernel_sigtermz.SpyderKernelManager._async_send_kernel_sigterms   sR     ??##/// %%d&6&6&>&>&B&BCCC 
 Ds   AAAA)F)__name__
__module____qualname____doc__r	   staticmethodsignalSIGTERMr%   boolr4   r   _kill_kernelr6   _send_kernel_sigterm r   r   r   r      ss    ? &,nnT%)- -^2 2 2< ./LD D D $$>?r   r   )	r:   r   r<   jupyter_client.utilsr   r   qtconsole.managerr   r   rA   r   r   <module>rD      s-     
  *  -g@/ g@r   