B -_"@s$ddlZddlZddlZddlZddlmZmZddlmZddlm Z ddlm Z ddd d d d d gZ ej dkrzdZ dZneeddZ ejdZerejejdanejadd Zdd ZddZddZdd Zd&ddZddZddZdd ZgZ dd Z!d!d"Z"d#d$Z#d%d Z$dS)'N)get_start_methodset_start_method)process) reduction)util_mainfreeze_supportset_executableget_executableget_preparation_dataget_command_lineimport_main_pathwin32Ffrozenzpythonservice.exez python.execCs|adS)N) _python_exe)Zexer+/usr/lib/python3.7/multiprocessing/spawn.pyr )scCstS)N)rrrrrr -scCs$t|dkr|ddkrdSdSdS)z= Return whether commandline indicates we are forking rz--multiprocessing-forkTFN)len)argvrrr is_forking4srcCshttjrdi}xBtjddD]0}|d\}}|dkrBd||<qt|||<qWtf|tdS)zE Run code for process object if this in not the main process rN=None)rsysrsplitint spawn_mainexit)kwdsargnamevaluerrrr >s   cKshttddr(tjdgdd|DSd}|ddd |D;}t}tg|d |dgSd S) zJ Returns prefix of command line used for spawning a child process rFz--multiprocessing-forkcSsg|] }d|qS)z%s=%rr).0itemrrr Tsz$get_command_line..zWsz#get_command_line..z-cN)getattrr executableitemsjoinrZ_args_from_interpreter_flagsr)rprogZoptsrrrr Ns cCsnttjstdtjdkr@ddl}t||}||t j }nddl m }||j _|}t|}t|dS)z7 Run code specified by data received over pipe z Not forkingrrNr)semaphore_tracker)rrrAssertionErrorplatformmsvcrtrZ steal_handleZopen_osfhandleosO_RDONLYr,Z_semaphore_trackerZ_fdrr)Z pipe_handleZ parent_pidZ tracker_fdr/Z new_handlefdr,Zexitcoderrrr\s   rc Cs^tj|ddd@}dt_z$tj|}t|tj|}Wdt`XWdQRX| S)NrbT)closefd) r0fdopenrcurrent_process _inheritingrpickleloadprepare _bootstrap)r3Z from_parentZpreparation_dataselfrrrrms  cCsttddrtddS)Nr8Fa 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'rr7 RuntimeErrorrrrr_check_not_importing_mainys r?cCstttjtjd}tjdk r2tj|d<t j }y| d}Wnt k r^Yn Xtj||<|j||t jtjttdt jd}t|jdd}|dk r||d<nft jd kststst|d d}|dk rtj |s tjdk r tj tj|}tj ||d <|S) zM Return info about parent needed by child to unpickle process object ) log_to_stderrauthkeyN log_levelr2)r!sys_pathsys_argvorig_dirdir start_method__main__r!init_main_from_namer__file__init_main_from_path)r?dictrZ_log_to_stderrrr7rAZ_loggerZgetEffectiveLevelrpathcopyindex ValueError ORIGINAL_DIRupdaterr0getcwdrmodulesr'__spec__r.WINEXE WINSERVICEisabsr*normpath)r!drCi main_moduleZ main_mod_name main_pathrrrr s>         cCsd|kr|dt_d|kr,|dt_d|krD|drDtd|kr^t|dd|krp|dt_ d|kr|dt_ d|krt |dd|kr|dt_ d |krt|d d d d |krt|d nd |krt|d dS)zE Try to get current process ready to unpickle process object r!rAr@rBrCrDrFrErGT)ZforcerIrKN)rr7r!rArr@Z get_loggerZsetLevelrrMrr0chdirrQr_fixup_main_from_name_fixup_main_from_path)datarrrr;s,   r;cCs~tjd}|dks|dr dSt|jdd|kr6dSt|td}t j |ddd}|j ||tjd<tjd<dS)NrHz .__main__r! __mp_main__T)run_nameZ alter_sys) rrTendswithr'rUold_main_modulesappendtypes ModuleTyperunpyZ run_module__dict__rR)Zmod_name current_mainr\ main_contentrrrr_s    r_cCstjd}tjtj|d}|dkr.dSt|dd|krBdSt|t d}t j |dd}|j ||tjd<tjd<dS)NrHrZipythonrJrb)rc)rrTr0rMsplitextbasenamer'rerfrgrhriZrun_pathrjrR)r]rkZ main_namer\rlrrrr`s    r`cCs t|dS)z< Set sys.modules['__main__'] to module at main_path N)r`)r]rrrrs)NN)%r0rrirgr2rrrcontextrr__all__r.rVrWr'r(lowerrdrMr* exec_prefixrr r rr r rrr?r rer;r_r`rrrrr s>         2&