U
    !c                     @   s   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mZ d dl	m
Z
mZ d dlmZ d dlmZ ddlmZmZ d	gZd
d Zeedoeejej ZG dd	 d	eZdd Zdd Zdd ZdS )    N)load)processutil)get_spawning_popenset_spawning_popen)Popen)	duplicate   )	reductionspawnr   c                 C   s    | |kpt j| t j|kS N)ospathnormcase)p1p2 r   R/tmp/pip-unpacked-wheel-ii96bjgz/joblib/externals/loky/backend/popen_loky_win32.py_path_eq   s    r   _base_executablec                   @   s$   e Zd ZdZdZdd Zdd ZdS )r   z@
    Start a subprocess to run the code of a process object
    Zlokyc                 C   s  t |jt|dd}t \}}tt|dd}t	| t
t |d}ddd |D }t  }tj|j}trt|tjrtj}tj|d< zt|d	}	z4d}
t||d d |
d
|d d 	\}}}}t| W n  tk
r   t|  Y nX || _d | _|| _t|| _t | tj| jf t!|  zt"#||	 t"#||	 W 5 t!d  X W 5 Q R X W nF t$k
r } z&|j%dkr t&d|j d W 5 d }~X Y nX d S )NZinit_main_moduleT)inheritable)Z
parent_pidpipe_handle c                 s   s   | ]}d | d V  qdS )"Nr   ).0xr   r   r   	<genexpr>3   s     z!Popen.__init__.<locals>.<genexpr>__PYVENV_LAUNCHER__wbr      zWhile starting z, ignored a IOError 22)'r   Zget_preparation_data_namegetattrr   piper   msvcrtZget_osfhandlecloseget_command_linegetpidjoinget_executableenvironenvWINENVr   sys
executabler   open_winapiZCreateProcessZCloseHandleBaseExceptionpid
returncode_handleintsentinelr   ZFinalizer   r
   dumpIOErrorerrnodebug)selfZprocess_objZ	prep_dataZrfdZwfdZrhandlecmdZ
python_exeZ	child_envZto_childZinherithpZhtr1   _excr   r   r   __init__(   sb     


      

zPopen.__init__c                 C   s   | t  kstt|| jS r   )r   AssertionErrorr   r5   )r:   handler   r   r   duplicate_for_childl   s    zPopen.duplicate_for_childN)__name__
__module____qualname____doc__methodr?   rB   r   r   r   r   r   "   s   Dc                 K   s@   t tddrtjd| gS d}t }t f|d|d| fS dS )zJ
    Returns prefix of command line used for spawning a child process
    frozenF--multiprocessing-forkzGfrom joblib.externals.loky.backend.popen_loky_win32 import main; main()z-cN)r!   r,   r-   r   _args_from_interpreter_flagsr   r(   )r   kwdsprogoptsr   r   r   r%   q   s    
   r%   c                 C   s4   t | dkr,| d dkr,t | dks(tdS dS dS )z=
    Return whether commandline indicates we are forking
       r	   rI      TFN)lenr@   )argvr   r   r   
is_forking~   s    rR   c                  C   s   t tjstttjd } t| tj}t	|d}dt
 _t|}t| t|}dt
 _|  | }t| dS )z7
    Run code specified by data received over pipe
    rbTFN)rR   r,   rQ   r@   r4   r#   open_osfhandler   O_RDONLYfdopenr   current_processZ_inheritingr   r   preparer$   
_bootstrapexit)rA   fdZfrom_parentZpreparation_datar:   exitcoder   r   r   main   s    


r^   )r   r,   r#   r/   pickler   multiprocessingr   r   Zmultiprocessing.contextr   r   Z!multiprocessing.popen_spawn_win32r   Z_PopenZmultiprocessing.reductionr    r
   r   __all__r   hasattrr-   r   r+   r%   rR   r^   r   r   r   r   <module>   s$   
	O