o w[eP$@sddlZddlZddlZddlZddlmZmZddlmZddlm Z ddlm Z gdZ ej dkr8d Z d Zneed d Z ejd ZerQejejd anejad dZddZddZddZddZd'ddZddZddZddZgZ 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|adSN _python_exe)exer,/usr/lib/python3.10/multiprocessing/spawn.pyr )sr cCstSrrrrrrr -sr cCs t|dkr|ddkrdSdS)z= Return whether commandline indicates we are forking r--multiprocessing-forkTF)len)argvrrr is_forking4srcCslttjr4i}tjddD]}|d\}}|dkr d||<qt|||<qtdi|tdSdS)zE Run code for process object if this in not the main process rN=Noner)rsysrsplitint spawn_mainexit)kwdsargnamevaluerrrr >s   r cKsdttddrtjdgdd|DSd}|ddd |D;}t}tg|d |dgS) zJ Returns prefix of command line used for spawning a child process rFrcSsg|]}d|qS)%s=%rr.0itemrrr Tsz$get_command_line..zWsz#get_command_line..z-c)getattrr executableitemsjoinr_args_from_interpreter_flagsr)r#progoptsrrrr Ns r c Csttjs Jdtjdkr9ddl}ddl}|dur&||j|jBd|}nd}t j ||d}| |t j }|}nddlm} || j_|}t |}t||} t| dS) z7 Run code specified by data received over pipe z Not forkingrrNF)source_processr)resource_tracker)rrrplatformmsvcrt_winapi OpenProcess SYNCHRONIZEPROCESS_DUP_HANDLEr duplicateopen_osfhandleosO_RDONLYr5_resource_tracker_fdduprr") pipe_handle parent_pid tracker_fdr7r8r4 new_handlefdparent_sentinelr5exitcoderrrr!\s*     r!c Cs|tj|ddd)}dt_ztj|}t|tj|}Wt`nt`wWdn1s4wY| |S)NrbT)closefd) r>fdopenrcurrent_process _inheritingrpickleloadprepare _bootstrap)rHrI from_parentpreparation_dataselfrrrrxs   rcCsttddr tddS)NrOFa 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-rrN RuntimeErrorrrrr_check_not_importing_mainsrXcCstttjtjd}tjdurtj|d<t j }z| d}Wn t y.Ynwtj||<|j||t jtjttdt jd}t|jdd}|durZ||d<|St jd ksctstst|d d}|durtj |stjdurtj tj|}tj ||d <|S) zM Return info about parent needed by child to unpickle process object ) log_to_stderrauthkeyN log_levelr@)r%sys_pathsys_argvorig_dirdir start_method__main__r%init_main_from_namer__file__init_main_from_path)rXdictr_log_to_stderrrrNrZ_loggergetEffectiveLevelrpathcopyindex ValueError ORIGINAL_DIRupdaterr>getcwdrmodulesr-__spec__r6WINEXE WINSERVICEisabsr0normpath)r%dr\i main_module main_mod_name main_pathrrrr sF         r cCsd|vr |dt_d|vr|dt_d|vr"|dr"td|vr/t|dd|vr8|dt_ d|vrA|dt_ d|vrLt |dd|vrU|dt_ d |vrat|d d d d |vrmt|d dSd |vryt|d dSdS)zE Try to get current process ready to unpickle process object r%rZrYr[r\r]r_r^r`T)forcerbrdN)rrNr%rZrrY get_loggersetLevelrrirr>chdirrmr_fixup_main_from_name_fixup_main_from_path)datarrrrRs.   rRcCs~tjd}|dks|drdSt|jdd|krdSt|td}t j |ddd}|j ||tjd<tjd<dS)Nraz .__main__r% __mp_main__T)run_name alter_sys) rrpendswithr-rqold_main_modulesappendtypes ModuleTyperunpy run_module__dict__rn)mod_name current_mainrx main_contentrrrrs    rcCstjd}tjtj|d}|dkrdSt|dd|kr!dSt|t d}t j |dd}|j ||tjd<tjd<dS)Nraripythonrcr)r)rrpr>risplitextbasenamer-rrrrrrun_pathrrn)rzr main_namerxrrrrr s    rcCs t|dS)z< Set sys.modules['__main__'] to module at main_path N)r)rzrrrr%s r)NN)%r>rrrr@rrrcontextrr__all__r6rrrsr-r.lowerrrir0 exec_prefixrr r rr r r!rrXr rrRrrrrrrrs>         2&