a
    <+b                     @   s   d 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Zddlm	Z	 ddl
mZ ejjZdejd  ZeejedZdd	d
ZdddZdddZddeddddfddZddlmZ G dd deZedkre  dS )z#The IPython kernel spec for Jupyter    N)KernelSpecManager   )_is_debugpy_availablezpython%iZ	resourcesipykernel_launcherc                 C   s2   |du rt j}|pg }|d| ddg}|| |S )a  Build Popen command list for launching an IPython kernel.

    Parameters
    ----------
    mod : str, optional (default 'ipykernel')
        A string of an IPython module whose __main__ starts an IPython kernel
    executable : str, optional (default sys.executable)
        The Python executable to use for the kernel process.
    extra_arguments : list, optional
        A list of extra arguments to pass when executing the launch code.

    Returns
    -------
    A Popen command list
    Nz-mz-fz{connection_file})sys
executableextend)modr   extra_argumentsZ	arguments r   3lib/python3.9/site-packages/ipykernel/kernelspec.pymake_ipkernel_cmd   s    
r   c                 C   s"   t | ddtjd  ddtidS )zConstruct dict for kernel.jsonr
   zPython %i (ipykernel)r   ZpythonZdebugger)argvdisplay_nameZlanguagemetadata)r   r   version_infor   r   r   r   r   get_kernel_dict3   s
    r   c                 C   s   | du rt jtjddt} tt|  t 	| j
}|t	j@ sRt | |t	jB  t|}|rh|| tt| dd }tj||dd W d   n1 s0    Y  | S )zWrite a kernel spec directory to `path`

    If `path` is not specified, a temporary directory is created.
    If `overrides` is given, the kernelspec JSON is updated before writing.

    The path to the kernelspec is always returned.
    NZ_kernels)suffixzkernel.jsonwr   )indent)ospathjointempfileZmkdtempKERNEL_NAMEshutilZcopytree	RESOURCESstatst_modeS_IWUSRchmodr   updateopenpjoinjsondump)r   	overridesr
   maskZkernel_dictfr   r   r   write_kernel_spec=   s    

.r*   Fc                 C   s   | du rt  } |tkr"|du r"|}i }|r2||d< |rZd|g}|s^dtjd |f |d< nd}|rj||d< t||d}	| j|	|||d}
t|	 |
S )	a^  Install the IPython kernelspec for Jupyter

    Parameters
    ----------
    kernel_spec_manager : KernelSpecManager [optional]
        A KernelSpecManager to use for installation.
        If none provided, a default instance will be created.
    user : bool [default: False]
        Whether to do a user-only install, or system-wide.
    kernel_name : str, optional
        Specify a name for the kernelspec.
        This is needed for having multiple IPython kernels for different environments.
    display_name : str, optional
        Specify the display name for the kernelspec
    profile : str, optional
        Specify a custom profile to be loaded by the kernel.
    prefix : str, optional
        Specify an install prefix for the kernelspec.
        This is needed to install into a non-default location, such as a conda/virtual-env.
    env : dict, optional
        A dictionary of extra environment variables for the kernel.
        These will be added to the current environment variables before the
        kernel is started

    Returns
    -------
    The path where the kernelspec was installed.
    Nr   	--profilezPython %i [profile=%s]r   env)r'   r
   )kernel_nameuserprefix)r   r   r   r   r*   Zinstall_kernel_specr   Zrmtree)Zkernel_spec_managerr.   r-   r   r/   profiler,   r'   r
   r   destr   r   r   install[   s(    
r2   )Applicationc                   @   s&   e Zd ZdZdZdddZdd ZdS )	InstallIPythonKernelSpecAppzDummy app wrapping argparsezipython-kernel-installNc                 C   s    |d u rt jdd  }|| _d S )Nr   )r   r   )selfr   r   r   r   
initialize   s    z&InstallIPythonKernelSpecApp.initializec              
   C   s^  dd l }|j| jdd}|jdddd |jdttd	d
 |jdtdd |jdtdd |jdtdd |jddtjddtj d |jdddddd || j	}|j
rdd |j
D |_
z$t|j|j|j|j|j|j
d}W nd tyF } zJ|jtjkr0t|tjd  |jr&td!tjd  | d"  W Y d }~n
d }~0 0 td#|j|f  d S )$Nr   z Install the IPython kernel spec.)progZdescriptionz--user
store_truez3Install for the current user instead of system-wide)actionhelpz--namezdSpecify a name for the kernelspec. This is needed to have multiple IPython kernels at the same time.)typedefaultr:   z--display-namezdSpecify the display name for the kernelspec. This is helpful when you have multiple IPython kernels.)r;   r:   r+   z]Specify an IPython profile to load. This can be used to create custom versions of the kernel.z--prefixzSpecify an install prefix for the kernelspec. This is needed to install into a non-default location, such as a conda/virtual-env.z--sys-prefixZstore_constr/   z[Install to Python's sys.prefix. Shorthand for --prefix='%s'. For use in conda/virtual-envs.)r9   Zconstr1   r:   z--envappend   )ZENVZVALUEz)Set environment variables for the kernel.)r9   nargsmetavarr:   c                 S   s   i | ]\}}||qS r   r   ).0kvr   r   r   
<dictcomp>       z5InstallIPythonKernelSpecApp.start.<locals>.<dictcomp>)r.   r-   r0   r/   r   r,   )filez$Perhaps you want `sudo` or `--user`?r   zInstalled kernelspec %s in %s)argparseArgumentParsernameadd_argumentstrr   r   r/   
parse_argsr   r,   r2   r.   r0   r   OSErrorerrnoZEACCESprintstderrexit)r5   rG   parserZoptsr1   er   r   r   start   sT    


z!InstallIPythonKernelSpecApp.start)N)__name__
__module____qualname____doc__rI   r6   rT   r   r   r   r   r4      s   
r4   __main__)r   NN)N)NNN)rX   rN   r%   r   r   r   r   r   Zjupyter_client.kernelspecr   Zipkernelr   r   r   r$   r   r   dirname__file__r   r   r   r*   r2   Ztraitlets.configr3   r4   rU   Zlaunch_instancer   r   r   r   <module>   s,   




:0