o $"bK@sdZddlmZmZmZddlZddlZddlmZm Z ddl Z e j r(ddl Z nddl Z e eZddZddZd d Zd d Zd dZddZddZddZddZddZddZddZddZedkrmedSdS) z[Implement https://www.python.org/dev/peps/pep-0514/ to discover interpreters - Windows only)absolute_importprint_functionunicode_literalsN) basicConfig getLoggerccs:d} z t||VWn tyYdSw|d7}q)NrT)winregEnumKeyOSError)keyatr E/usr/lib/python3/dist-packages/virtualenv/discovery/windows/pep514.py enum_keyss rcCs(z t||dWStyYdSw)Nr)r QueryValueExr )r value_namer r r get_values  rccsdtjddddftjddtjdftjddtjdffD]\}}}}}t|||||D]}|Vq)qdS)NHKEY_CURRENT_USERzSoftware\Pythonr@HKEY_LOCAL_MACHINE )rrrKEY_WOW64_64KEYKEY_WOW64_32KEY process_set)hive hive_namer flags default_archspecr r rdiscover_pythons$srccsz9t||dtj|B#}t|D]}|dkrqt||||D]}|Vq qWdWdS1s3wYWdStyDYdSw)Nr PyLauncher)r OpenKeyExKEY_READrprocess_companyr )rrr rrroot_keycompanyrr r rr.s & rccs`t||}t|D]}t|||||}|dur|Vq WddS1s)wYdSN)rr!r process_tag)rr%r$r company_keytagrr r rr#:s "r#cCst||S}t||||}|durA|\}}} t|||||} | durIt||||} | durQ| \} } |||| | | fWdSWddSWddSWddS1s\wYdSr&)rr!load_version_dataload_arch_dataload_exe)rr%r(r)rtag_keyversionmajorminor_archexe_dataexeargsr r rr'Bs" "r'c Cs>d|||}zt|d|p}|St|d}|dur6t|d}|dur-t|dn tj|td}|durXtj |rXt|d}||fWdWdWSt|d|Wdn1sjwYWdWdSWdWdS1swYWdSt ytd|d d YdSw) N{}/{}/{}z{}\InstallPathExecutablePathz#no ExecutablePath or default for itz python.exeExecutableArgumentsz could not load exe with value {}z{}/{} InstallPathmissing) formatrr!rmsgospathjoinstrexistsr ) rr%r(r)key_pathip_keyr4ipr5r r rr,Os8       r,c Cs`t|d}|dur.d|||}zt|WSty-}z t||WYd}~|Sd}~ww|S)NSysArchitecturez{}/{}/{}/SysArchitecture)rr; parse_arch ValueErrorr<)rr%r)r-rarch_strrBsys_archr r rr+fs  r+cCsXt|tjr!td|}|rttt|Sd |}t |d t |}t |)Nz ^(\d+)bit$invalid format {}zarch is not string: {}) isinstancesix string_typesrematchintnextitergroupsr;reprrG)rHrOerrorr r rrFqs   rFc Cs~t|dd|||f|d|||ffD]'\}}|durs"z parse_version..rJzversion is not string: {}) rKrLrMrNrOtuplerSr;rTrG) version_strrOrUr r rrWs   rWcCstd||dS)Nz5PEP-514 violation in Windows Registry at {} error: {})LOGGERwarningr;)r>whatr r rr<sr<cCs:tg}tD] }|t|qtdt|dS)N )rrappendrTprintr?sorted) interpretersrr r r_runs  rg__main__)__doc__ __future__rrrr=rNloggingrrrLPY3r_winreg__name__r_rrrrr#r'r,r+rFr*rWr<rgr r r rs4