B
    U²È[Q  ã               @   s(  d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlZddlm
Z ddlmZ ddlmZmZmZmZ ddlmZ ddlmZmZmZ dd	lmZmZ dd
lmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z< ddl=m>Z> e?eƒZ@e@ Adddddddddœ¡ e?eƒZBeB Add d!iid"fdd#d!iid$fdd%d&iid'fd(œ¡ e@ Ae¡ eB Ae¡ e@ Ae<¡ eB Ae;¡ d)ZCG d*d„ deee/ƒZDeDjEZFd+d,„ ZGeHd-kr$eGƒ  dS ).z%An Application for launching a kernelé    )Úprint_functionN)Úioloop)Ú	ZMQStream)ÚBaseIPythonApplicationÚ
base_flagsÚbase_aliasesÚcatch_config_error)Ú
ProfileDir)ÚInteractiveShellAppÚshell_flagsÚshell_aliases)ÚfilefindÚensure_dir_exists)	ÚAnyÚInstanceÚDictÚUnicodeÚIntegerÚBoolÚDottedObjectNameÚTypeÚdefault)Úimport_item)Újupyter_runtime_dir)Úwrite_connection_file)ÚConnectionFileMixiné   )ÚIOPubThread)Ú	Heartbeat)ÚIPythonKernel)ÚParentPollerUnixÚParentPollerWindows)ÚSessionÚsession_flagsÚsession_aliases)ÚZMQInteractiveShellzIPKernelApp.ipzIPKernelApp.hb_portzIPKernelApp.shell_portzIPKernelApp.iopub_portzIPKernelApp.stdin_portzIPKernelApp.control_portzIPKernelApp.connection_filezIPKernelApp.transport)ÚipÚhbÚshellÚiopubÚstdinÚcontrolÚfÚ	transportÚIPKernelAppÚ	no_stdoutTz"redirect stdout to the null deviceÚ	no_stderrz"redirect stderr to the null deviceÚpylabÚautoz^Pre-load matplotlib and numpy for interactive use with
        the default matplotlib backend.)z	no-stdoutz	no-stderrr1   a#  NOTE: When using the `ipython kernel` entry point, Ctrl-C will not work.

To exit, you will have to explicitly quit this process, by either sending
"quit" from a client, or using Ctrl-\ in UNIX-like environments.

To read more about this, see https://github.com/ipython/ipython/issues/2049

c                   sú  e Zd ZdZeeƒZeeƒZe	e
eegZeddddjddZeƒ Zeƒ ZeeddZeƒ Zd	d
iZeƒ Zedƒdd„ ƒZedd„ ƒZedddjddZ edddjddZ!edddjddZ"e#dddjddZ$e#dddjddZ%e&e'e(j) *d¡püdƒddjddZ+e&e'e(j) *d¡p"dƒddjddZ,dd„ Z-d d!„ Z.d"d#„ Z/d$d%„ Z0d&d'„ Z1d(d)„ Z2d*d+„ Z3d,d-„ Z4d.d/„ Z5d0d1„ Z6d2d3„ Z7d4d5„ Z8d6d7„ Z9d8d9„ Z:d:d;„ Z;d<d=„ Z<d>d?„ Z=d@dA„ Z>‡ fdBdC„Z?dDdE„ Z@eAdK‡ fdGdH„	ƒZBdIdJ„ ZC‡  ZDS )Lr.   zipython-kernelz ipykernel.ipkernel.IPythonKernelzipykernel.kernelbase.Kernelz¤The Kernel subclass to be used.

    This should allow easy re-use of the IPKernelApp entry point
    to configure and launch kernels other than IPython's own.
    )ÚklassÚhelpT)Zconfig)Z
allow_noneÚinstall)z0ipykernel.kernelspec.InstallIPythonKernelSpecAppzInstall the IPython kernelÚconnection_dirc             C   s   t ƒ S )N)r   )Úself© r8   ú2lib/python3.7/site-packages/ipykernel/kernelapp.pyÚ_default_connection_dir   s    z#IPKernelApp._default_connection_dirc             C   s0   t j | j¡| jkr&t j | j| j¡S | jS d S )N)ÚosÚpathÚbasenameÚconnection_fileÚjoinr6   )r7   r8   r8   r9   Úabs_connection_fileƒ   s    zIPKernelApp.abs_connection_fileFz"redirect stdout to the null device)r4   z"redirect stderr to the null devicez(Only send stdout/stderr to output streamzipykernel.iostream.OutStreamz*The importstring for the OutStream factoryz$ipykernel.displayhook.ZMQDisplayHookz,The importstring for the DisplayHook factoryZJPY_PARENT_PIDr   zœkill this process if its parent dies.  On Windows, the argument
        specifies the HANDLE of the parent process, otherwise it is simply boolean.
        ZJPY_INTERRUPT_EVENTzYONLY USED ON WINDOWS
        Interrupt this process when the parent is signaled.
        c             C   s   | j t_ d S )N)Ú
excepthookÚsys)r7   r8   r8   r9   Úinit_crash_handler   s    zIPKernelApp.init_crash_handlerc             C   s   t j|||tjd d S )N)Úfile)Ú	tracebackÚprint_exceptionrB   Ú
__stderr__)r7   ÚetypeÚevalueÚtbr8   r8   r9   rA       s    zIPKernelApp.excepthookc             C   sD   t jdkr(| js| jr@t| j| jƒ| _n| jr@| jdkr@tƒ | _d S )NZwin32r   )rB   ÚplatformÚ	interruptÚparent_handler!   Úpollerr    )r7   r8   r8   r9   Úinit_poller¤   s
    
zIPKernelApp.init_pollerc             C   s²   d| j | jf }| j dkrD|dkr.| |¡}q®| d| j|f ¡ nj| j dkr®|dkr’d}d| j|f }x6tj |¡rŽ|d }d| j|f }qjW nd| j|f }| d| ¡ |S )	Nz%s://%sZtcpr   ztcp://%s:%iZipcr   z%s-%izipc://%s)r-   r&   Zbind_to_random_portZbindr;   r<   Úexists)r7   ÚsÚportZifacer<   r8   r8   r9   Ú_bind_socket®   s    

zIPKernelApp._bind_socketc             C   sD   | j }| j d|¡ t|| j| jj| j| j| j	| j
| j| jd	 dS )z"write connection info to JSON filezWriting connection file: %s)r&   Úkeyr-   Ú
shell_portÚ
stdin_portÚhb_portÚ
iopub_portÚcontrol_portN)r@   ÚlogÚdebugr   r&   ÚsessionrT   r-   rU   rV   rW   rX   rY   )r7   Úcfr8   r8   r9   r   Á   s
    z!IPKernelApp.write_connection_filec          	   C   sH   | j }| j d|¡ yt |¡ W n ttfk
r:   Y nX |  ¡  d S )NzCleaning up connection file: %s)r@   rZ   r[   r;   ÚremoveÚIOErrorÚOSErrorZcleanup_ipc_files)r7   r]   r8   r8   r9   Úcleanup_connection_fileÉ   s    z#IPKernelApp.cleanup_connection_filec             C   s¶   | j sdt ¡  | _ yt| j d| jgƒ| _ W nD tk
rp   | j d| j ¡ ttj	 
| j¡dƒ t | j¡ d S X y|  ¡  W n2 tk
r°   | jjd| j dd |  d¡ Y nX d S )	Nzkernel-%s.jsonÚ.zConnection file not found: %siÀ  z"Failed to load connection file: %rT)Úexc_infor   )r>   r;   Úgetpidr   r6   r_   rZ   r[   r   r<   Údirnamer@   ÚatexitÚregisterra   Zload_connection_fileÚ	ExceptionÚerrorÚexit)r7   r8   r8   r9   Úinit_connection_fileÓ   s    z IPKernelApp.init_connection_filec             C   sú   | j  dt ¡ ¡ tj ¡ }| tj¡| _	d| j	_
|  | j	| j¡| _| j  d| j ¡ | tj¡| _d| j_
|  | j| j¡| _| j  d| j ¡ | tj¡| _d| j_
|  | j| j¡| _| j  d| j ¡ ttdƒrìd | j	_ | j_| j_|  |¡ d S )NzStarting the kernel at pid: %iiè  z shell ROUTER Channel on port: %iz stdin ROUTER Channel on port: %iz"control ROUTER Channel on port: %iZROUTER_HANDOVERr   )rZ   Úinfor;   rd   ÚzmqÚContextÚinstanceÚsocketZROUTERÚshell_socketÚlingerrS   rU   r[   Ústdin_socketrV   Úcontrol_socketrY   ÚhasattrZrouter_handoverÚ
init_iopub)r7   Úcontextr8   r8   r9   Úinit_socketså   s"    

zIPKernelApp.init_socketsc             C   sj   |  tj¡| _d| j_|  | j| j¡| _| j d| j ¡ |  	¡  t
| jdd| _| j ¡  | jj| _d S )Niè  ziopub PUB Channel on port: %iT)Úpipe)rp   rm   ZPUBÚiopub_socketrr   rS   rX   rZ   r[   Úconfigure_tornado_loggerr   Úiopub_threadÚstartZbackground_socket)r7   rw   r8   r8   r9   rv     s    
zIPKernelApp.init_iopubc             C   sJ   t  ¡ }t|| j| j| jfƒ| _| jj| _| j 	d| j ¡ | j 
¡  dS )zstart the heart beatingz!Heartbeat REP Channel on port: %iN)rm   rn   r   r-   r&   rW   Ú	heartbeatrR   rZ   r[   r}   )r7   Zhb_ctxr8   r8   r9   Úinit_heartbeat  s
    
zIPKernelApp.init_heartbeatc             C   s¼   t j | j¡}|| jks,t j | j¡| jkr2|}n| j}dd| g}x|D ]}| j |¡ qJW | jsš| j	t
jk rštttjd x|D ]}t|tjd q„W t| j| j| j| j| jd| _dS )z(display connection info, and store portsz.To connect another client to this kernel, use:z    --existing %s)rD   )r(   r)   r*   r'   r+   N)r;   r<   r=   r>   re   r6   rZ   rl   rM   Ú	log_levelÚloggingÚCRITICALÚprintÚ_ctrl_c_messagerB   Ú
__stdout__ÚdictrU   rX   rV   rW   rY   Úports)r7   r=   ÚtailÚlinesÚliner8   r8   r9   Úlog_connection_info  s     




zIPKernelApp.log_connection_infoc             C   s@   | j s| jr<ttjdƒ}| j r*| t_t_| jr<| t_t_	dS )z/redirects stdout/stderr to devnull if necessaryÚwN)
r/   r0   Úopenr;   ÚdevnullrB   Ústdoutr…   ÚstderrrG   )r7   Z	blackholer8   r8   r9   Úinit_blackhole8  s    zIPKernelApp.init_blackholec             C   sÀ   | j rˆtt| j ƒƒ}tjdk	r(tj ¡  | jr2dntj}| jrBdntj}|| j	| j
d|dt_tjdk	rrtj ¡  || j	| j
d|dt_| jr´tt| jƒƒ}|| j	| jƒ| _| jt_|  ¡  dS )z.Redirect input streams and set a display hook.Nr   )Zechor   )Úoutstream_classr   ÚstrrB   r   ÚflushÚquietr…   rG   r\   r|   r   Údisplayhook_classrz   ÚdisplayhookÚpatch_io)r7   Zoutstream_factoryZe_stdoutZe_stderrZdisplayhook_factoryr8   r8   r9   Úinit_ioA  s&    







zIPKernelApp.init_ioc                sr   yddl }W n tk
r    Y nNX |j‰ tjdf‡ fdd„	}||_t|dƒrn|j‰tjddf‡fdd	„	}||_dS )
zAPatch important libraries that can't handle sys.stdout forwardingr   NTc                s   ˆ f | |dœ|—ŽS )N)rD   Úall_threadsr8   )rD   rš   Úkwargs)Úfaulthandler_enabler8   r9   Úenableg  s    z$IPKernelApp.patch_io.<locals>.enablerg   Fc                s   ˆ | f|||dœ|—ŽS )N)rD   rš   Úchainr8   )ZsignumrD   rš   rž   r›   )Úfaulthandler_registerr8   r9   rg   n  s    
z&IPKernelApp.patch_io.<locals>.register)ÚfaulthandlerÚImportErrorr   rB   rG   ru   rg   )r7   r    r   rg   r8   )rœ   rŸ   r9   r˜   Z  s    
zIPKernelApp.patch_ioc             C   s   t   t jt j¡ d S )N)ÚsignalÚSIGINTÚSIG_IGN)r7   r8   r8   r9   Úinit_signals  s    zIPKernelApp.init_signalc                s~   t | jƒ}t | jƒ}| jj}|| | j|||g| j| j| j| j	| j
| jd
‰ ˆ  dd„ | j ¡ D ƒ¡ ˆ | _‡ fdd„| j_dS )zCreate the Kernel object itself)
Úparentr\   Úcontrol_streamZshell_streamsr|   rz   rs   rZ   Úprofile_dirÚuser_nsc             S   s   i | ]\}}||d  “qS )Z_portr8   )Ú.0ÚnamerR   r8   r8   r9   ú
<dictcomp>‡  s   z+IPKernelApp.init_kernel.<locals>.<dictcomp>c                  s   ˆ j S )N)Zexecution_countr8   )Úkernelr8   r9   Ú<lambda>  s    z)IPKernelApp.init_kernel.<locals>.<lambda>N)r   rq   rt   Úkernel_classro   r\   r|   rz   rs   rZ   r¨   r©   Zrecord_portsr‡   Úitemsr­   r—   Zget_execution_count)r7   Zshell_streamr§   Zkernel_factoryr8   )r­   r9   Úinit_kernelv  s     



zIPKernelApp.init_kernelc                sP   t j d¡sdt jd< | j‰ ˆ j}z ‡ fdd„}|ˆ _t | ¡ W d|ˆ _X dS )z=Enable GUI event loop integration, taking pylab into account.Z
MPLBACKENDz'module://ipykernel.pylab.backend_inlinec                s(   t dtjd t ˆ j |¡tjd d S )Nz-GUI event loop or pylab initialization failed)rD   )rƒ   rB   r   ZInteractiveTBZstb2text)rH   rI   Zstb)r(   r8   r9   Úprint_tb£  s    
z,IPKernelApp.init_gui_pylab.<locals>.print_tbN)r;   ÚenvironÚgetr(   Ú_showtracebackr
   Úinit_gui_pylab)r7   rµ   r²   r8   )r(   r9   r¶     s    
zIPKernelApp.init_gui_pylabc             C   s(   t | jdd ƒ| _| jr$| jj | ¡ d S )Nr(   )Úgetattrr­   r(   ZconfigurablesÚappend)r7   r8   r8   r9   Ú
init_shell¬  s    zIPKernelApp.init_shellc          
      sb   t t| ƒ ¡  | jj}d|jkr^y| d¡ W n. tk
r\ } z| j 	d¡ W d d }~X Y nX d S )NZ
ipywidgetszAipywidgets package not installed.  Widgets will not be available.)
Úsuperr.   Úinit_extensionsr(   Zextension_managerZloadedZload_extensionr¡   rZ   r[   )r7   Zextension_manÚe)Ú	__class__r8   r9   r»   ±  s    
zIPKernelApp.init_extensionsc             C   s6   t  d¡}t  ¡ }t  t j¡}| |¡ | |¡ dS )aF   Configure the tornado logging.Logger.

            Must set up the tornado logger or else tornado will call
            basicConfig for the root logger which makes the root logger
            go to the real sys.stderr instead of the capture streams.
            This function mimics the setup of logging.basicConfig.
        ÚtornadoN)r   Z	getLoggerZStreamHandlerZ	FormatterZBASIC_FORMATZsetFormatterZ
addHandler)r7   ZloggerZhandlerZ	formatterr8   r8   r9   r{   ½  s
    

z$IPKernelApp.configure_tornado_loggerNc                sê   t t| ƒ |¡ | jd k	rd S t ¡  |  ¡  |  ¡  |  ¡  |  	¡  |  
¡  |  ¡  |  ¡  |  ¡  y|  ¡  W n(   | jtjk r–| jjddd Y nX |  ¡  |  ¡  |  ¡  | jrÒ|  ¡  |  ¡  |  ¡  tj ¡  tj ¡  d S )NzUnable to initialize signal:T)rc   )rº   r.   Ú
initializeÚsubappÚ
zmq_ioloopr5   r‘   rk   rO   rx   r   r   r‹   r™   r¥   r€   r   r‚   rZ   ri   r±   Z	init_pathr¹   r(   r¶   r»   Z	init_coderB   r   r”   r   )r7   Úargv)r½   r8   r9   r¿   Ë  s4    

zIPKernelApp.initializec             C   sf   | j d k	r| j  ¡ S | jd k	r(| j ¡  | j ¡  tj ¡ | _y| j ¡  W n tk
r`   Y nX d S )N)	rÀ   r}   rN   r­   r   ZIOLoopZcurrentZio_loopÚKeyboardInterrupt)r7   r8   r8   r9   r}   ñ  s    




zIPKernelApp.start)N)EÚ__name__Ú
__module__Ú__qualname__r«   r   Úkernel_aliasesÚaliasesÚkernel_flagsÚflagsr   r%   r	   r"   Úclassesr   Útagr¯   r   r­   rN   r   r   r~   r‡   Zsubcommandsr   r6   r   r:   Úpropertyr@   r   r/   r0   r•   r   r’   r–   r   Úintr;   r³   r´   rM   rL   rC   rA   rO   rS   r   ra   rk   rx   rv   r   r‹   r‘   r™   r˜   r¥   r±   r¶   r¹   r»   r{   r   r¿   r}   Ú__classcell__r8   r8   )r½   r9   r.   b   sd   

 
	%c              C   s   t  ¡ } |  ¡  |  ¡  dS )z!Run an IPKernel as an applicationN)r.   ro   r¿   r}   )Zappr8   r8   r9   Úmainÿ  s    rÐ   Ú__main__)IÚ__doc__Z
__future__r   rf   r;   rB   r¢   rE   r   r¾   r   rm   Zzmq.eventlooprÁ   Zzmq.eventloop.zmqstreamr   ZIPython.core.applicationr   r   r   r   ZIPython.core.profiledirr	   ZIPython.core.shellappr
   r   r   Zipython_genutils.pathr   r   Z	traitletsr   r   r   r   r   r   r   r   r   Zipython_genutils.importstringr   Zjupyter_core.pathsr   Zjupyter_clientr   Zjupyter_client.connectr   Ziostreamr   r~   r   Zipkernelr   Zparentpollerr    r!   Zjupyter_client.sessionr"   r#   r$   Zzmqshellr%   r†   rÇ   ÚupdaterÉ   r„   r.   Zlaunch_instanceZlaunch_new_instancerÐ   rÄ   r8   r8   r8   r9   Ú<module>   st   ,








   
