3 \Ÿ"ã@s.ddlZddlZddlZddlZddlmZmZddlmZddlm Z ddlm Z ddd d d d d gZ ej dkrzdZ dZn&ej dkoŽeeddƒZ ejjƒjdƒZer¶ejjejdƒanejadd „Zdd „Zdd„Zdd„Zdd „Zd&dd„Zdd„Zdd„Zdd „ZgZ dd „Z!d!d"„Z"d#d$„Z#d%d „Z$dS)'éNé)Úget_start_methodÚset_start_method)Úprocess)Ú reduction)ÚutilÚ_mainÚfreeze_supportÚset_executableÚget_executableÚget_preparation_dataÚget_command_lineÚimport_main_pathÚwin32FÚfrozenzpythonservice.exez python.execCs|adS)N)Ú _python_exe)Zexe©rú-/usr/lib64/python3.6/multiprocessing/spawn.pyr )scCstS)N)rrrrrr -scCs$t|ƒdkr|ddkrdSdSdS)z= Return whether commandline indicates we are forking érz--multiprocessing-forkTFN)Úlen)ÚargvrrrÚ is_forking4srcCshttjƒrdi}xBtjdd…D]0}|jdƒ\}}|dkrBd||<qt|ƒ||<qWtf|ŽtjƒdS)zE Run code for process object if this in not the main process rNú=ÚNone)rÚsysrÚsplitÚintÚ spawn_mainÚexit)ÚkwdsÚargÚnameÚvaluerrrr >s   cKshttddƒr(tjdgdd„|jƒDƒSd}|djdd „|jƒDƒƒ;}tjƒ}tg|d |dgSd S) zJ Returns prefix of command line used for spawning a child process rFz--multiprocessing-forkcSsg|] }d|‘qS)z%s=%rr)Ú.0Úitemrrrú Tsz$get_command_line..zWsz#get_command_line..z-cN)ÚgetattrrÚ executableÚitemsÚjoinrZ_args_from_interpreter_flagsr)rÚprogZoptsrrrr Ns cCs\tjdkr.ddl}tj||ƒ}|j|tjƒ}nddlm }||j _ |}t |ƒ}tj |ƒdS)z7 Run code specified by data received over pipe rrNr)Úsemaphore_tracker)rÚplatformÚmsvcrtrZ steal_handleZopen_osfhandleÚosÚO_RDONLYÚr,Z_semaphore_trackerZ_fdrr)Z pipe_handleZ parent_pidZ tracker_fdr.Z new_handleÚfdr,Zexitcoderrrr\s   rcCs^tj|ddd��@}dtjƒ_z$tjj|ƒ}t|ƒtjj|ƒ}Wdtjƒ`XWdQRX|j ƒS)NÚrbT)Úclosefd) r/ÚfdopenrÚcurrent_processÚ _inheritingrÚpickleÚloadÚprepareÚ _bootstrap)r2Z from_parentZpreparation_dataÚselfrrrrms  cCsttjƒddƒrtdƒ‚dS)Nr7Fa An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if __name__ == '__main__': freeze_support() ... The "freeze_support()" line can be omitted if the program is not going to be frozen to produce an executable.)r'rr6Ú RuntimeErrorrrrrÚ_check_not_importing_mainys r>cCs tƒttjtjƒjd�}tjdk r2tjjƒ|d<t j j ƒ}y|j dƒ}Wnt k r^Yn Xtj||<|j||t jtjtjƒtƒd�t jd}t|jddƒ}|dk r´||d<nht jd ksÌt oÈt �rt|d dƒ}|dk �rtj j|ƒ oøtjdk �r tj jtj|ƒ}tj j|ƒ|d <|S) zM Return info about parent needed by child to unpickle process object )Ú log_to_stderrÚauthkeyNÚ log_levelr1)r!Úsys_pathÚsys_argvÚorig_dirÚdirÚ start_methodÚ__main__r!Úinit_main_from_namerÚ__file__Úinit_main_from_path)r>ÚdictrZ_log_to_stderrrr6r@Z_loggerZgetEffectiveLevelrÚpathÚcopyÚindexÚ ValueErrorÚ ORIGINAL_DIRÚupdaterr/ÚgetcwdrÚmodulesr'Ú__spec__r-ÚWINEXEÚ WINSERVICEÚisabsr*Únormpath)r!ÚdrBÚiÚ main_moduleZ main_mod_nameÚ main_pathrrrr ‹s>         cCsðd|kr|dtjƒ_d|kr,|dtjƒ_d|krD|drDtjƒd|kr^tjƒj|dƒd|krp|dt_ d|kr‚|dt_ d|kr˜t j |dƒd|krª|dt_ d |krÂt|d d d �d |krØt|d ƒnd |krìt|d ƒdS)zE Try to get current process ready to unpickle process object r!r@r?rArBrCrErDrFT)ZforcerHrJN)rr6r!r@rr?Z get_loggerZsetLevelrrLrr/ÚchdirrPrÚ_fixup_main_from_nameÚ_fixup_main_from_path)Údatarrrr:¿s,   r:cCs~tjd}|dks|jdƒr dSt|jddƒ|kr6dStj|ƒtjdƒ}t j |ddd�}|j j |ƒ|tjd<tjd<dS)NrGz .__main__r!Ú __mp_main__T)Úrun_nameZ alter_sys) rrSÚendswithr'rTÚold_main_modulesÚappendÚtypesÚ ModuleTypeÚrunpyZ run_moduleÚ__dict__rQ)Zmod_nameÚ current_mainr[Ú main_contentrrrr^ås    r^cCsˆtjd}tjjtjj|ƒƒd}|dkr.dSt|ddƒ|krBdStj|ƒt j dƒ}t j |dd�}|j j|ƒ|tjd<tjd<dS)NrGrZipythonrIra)rb)rrSr/rLÚsplitextÚbasenamer'rdrerfrgrhZrun_pathrirQ)r\rjZ main_namer[rkrrrr_þs    r_cCs t|ƒdS)z< Set sys.modules['__main__'] to module at main_path N)r_)r\rrrrs)NN)%r/rrhrfr1rrrÚcontextrrÚ__all__r-rUrVr'r(ÚlowerrcrLr*Ú exec_prefixrr r rr r rrr>r rdr:r^r_rrrrrÚ s>        2&