U e5dn_ã@sdZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ej dZ ej dZ ej dZej dZeefZejZdZdZdZd Zd Zd Zd ZiZd d„ZiZdd„Zddd„ZGdd„dƒZGdd„dƒZdd„Z e!dk�rz e ƒZ"Wne#k �re$dƒYnXdS)z3Find modules used by a script, using introspection.éNÚ LOAD_CONSTÚ IMPORT_NAMEÚ STORE_NAMEÚ STORE_GLOBALéééééécCst |g¡ |¡dS©N)ÚpackagePathMapÚ setdefaultÚappend)Z packagenameÚpath©rú$/usr/lib64/python3.8/modulefinder.pyÚAddPackagePath(srcCs |t|<dSr )ÚreplacePackageMap)ZoldnameÚnewnamerrrÚReplacePackage3srcCstjj ¡tjj ||¡}|dkr8tdj|d�|d�‚|jtjjkrVddddt ffS|jtjj krtddddt ffS|j }|j  |¡rždtj |¡ddtffSt|jtjjƒr´t}n)rBÚsrrrÚ__repr__ss   zModule.__repr__)NN)r<Ú __module__Ú __qualname__rCrFrrrrr;ds r;c@sàeZdZd6dd„Zdd„Zdd„Zd d „Zd d „Zd d„Zd7dd„Z d8dd„Z dd„Z dd„Z d9dd„Z dd„Zdd„Zdd„Zd d!„Zd:d"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd;d,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„ZdS)<Ú ModuleFinderNrcCsZ|dkrtj}||_i|_i|_||_d|_|dk r8|ng|_|dk rJ|ng|_g|_dS)Nr) ÚsysrÚmodulesÚ badmodulesÚdebugÚindentÚexcludesÚ replace_pathsÚprocessed_paths)rBrrMrOrPrrrrC~szModuleFinder.__init__cGsV||jkrRt|jƒD]}tddd�qt|dd�|D]}tt|ƒdd�q6tƒdS)Nú ú ©Úend)rMÚrangerNÚprintÚrepr)rBÚlevelÚstrÚargsÚiÚargrrrÚmsgŠs  zModuleFinder.msgcGs,|d}||jkr(|jd|_|j|ŽdS©Nrr©rMrNr^©rBr[rYrrrÚmsgin“s  zModuleFinder.msgincGs,|d}||jkr(|jd|_|j|ŽdSr_r`rarrrÚmsgout™s  zModuleFinder.msgoutc CsB| dd|¡t |¡� }ddtf}| d|||¡W5QRXdS)NrÚ run_scriptrrÚ__main__)r^r4r5r.Ú load_module)rBÚpathnameÚfpÚstuffrrrrdŸs  zModuleFinder.run_scriptc CsTtj |¡\}}tj |¡\}}t |¡� }|dtf}| ||||¡W5QRXdS)Nr)r)rÚsplitr6r4r5r.rf)rBrgÚdirrZextrhrirrrÚ load_file¥s   zModuleFinder.load_filerc Cs\| dd||||¡|j||d�}| ||¡\}}| ||¡}|sF|S|jrX| ||¡dS)NrÚ import_hook©rY)r^Údetermine_parentÚfind_head_packageÚ load_tailr>Úensure_fromlist) rBrÚcallerÚfromlistrYÚparentÚqÚtailÚmrrrrm¬s  zModuleFinder.import_hookcCsN| dd||¡|r|dkr,| dd¡dS|j}|dkrÄ|jrH|d8}|dkrx|j|}||ksft‚| dd|¡|S| d¡|krŽtdƒ‚d |  d¡d| …¡}|j|}| dd|¡|S|jrò|j|}||ksàt‚| dd|¡|Sd|k�r>|  d¡}|d|…}|j|}|j|k�s,t‚| dd|¡|S| dd¡dS) Nérorzdetermine_parent -> Nonerzdetermine_parent ->Ú.zrelative importpath too deep) rbrcr<r>rKÚAssertionErrorÚcountr ÚjoinrjÚrfind)rBrsrYZpnamerur\rrrro·sB            zModuleFinder.determine_parentcCsâ| dd||¡d|kr@| d¡}|d|…}||dd…}n|}d}|r\d|j|f}n|}| |||¡}|rŒ| dd||f¡||fS|rÄ|}d}| |||¡}|rÄ| dd||f¡||fS| dd|¡td |ƒ‚dS) Nryrprzrrú%s.%szfind_head_package ->ú"raise ImportError: No module namedúNo module named )rbÚfindr<Ú import_modulercr )rBrurr\ÚheadrwZqnamervrrrrpÚs.  zModuleFinder.find_head_packagecCsž| dd||¡|}|rŒ| d¡}|dkr2t|ƒ}|d|…||dd…}}d|j|f}| |||¡}|s| dd|¡td|ƒ‚q| dd |¡|S) Nryrqrzrrrr€r�z load_tail ->)rbr‚Úlenr<rƒrcr )rBrvrwrxr\r„Zmnamerrrrqõs zModuleFinder.load_tailcCs€| dd|||¡|D]d}|dkrD|sz| |¡}|rz| ||d¡qt||ƒsd|j|f}| |||¡}|std|ƒ‚qdS)NryrrÚ*rrr�)r^Úfind_all_submodulesrrÚhasattrr<rƒr )rBrxrtÚ recursiveÚsubÚallÚsubnameZsubmodrrrrrs  zModuleFinder.ensure_fromlistc Csð|js dSi}g}|tjjdd…7}|tjjdd…7}|tjjdd…7}|jD]’}zt |¡}Wn&tk rŒ|  dd|¡YqTYnX|D]R}d}|D]0}t |ƒ} || d…|krž|d| …}qÐqž|r’|dkr’|||<q’qT|  ¡S)Nrzcan't list directoryrC) r>rrÚEXTENSION_SUFFIXESÚSOURCE_SUFFIXESÚBYTECODE_SUFFIXESr)ÚlistdirÚOSErrorr^r…Úkeys) rBrxrKÚsuffixesrkÚnamesrÚmodZsuffÚnrrrr‡s.    z ModuleFinder.find_all_submodulescCs | dd|||¡z|j|}Wntk r4YnX| dd|¡|S||jkrb| dd¡dS|r€|jdkr€| dd¡dSz| ||o�|j|¡\}}}Wn$tk rÂ| ddd¡YdSXz|  ||||¡}W5|ræ| ¡X|røt |||ƒ| dd|¡|S)Nrrƒzimport_module ->zimport_module -> None) rbrKÚKeyErrorrcrLr>Ú find_moduler ÚcloserfÚsetattr)rBZpartnameÚfqnamerurxrhrgrirrrrƒ.s:   ÿ  zModuleFinder.import_modulec Cs(|\}}}| dd||od|¡|tkrF| ||¡}| dd|¡|S|tkr`t| ¡|dƒ} n||tkrØz| ¡} tj   | |i¡Wn:t k r¾} z| ddt | ƒ|¡‚W5d} ~ XYnXt  t| ƒdd…¡} nd} | |¡}||_| �r|j�r| | ¡} | |_| | |¡| dd|¡|S)Nrrfrhzload_module ->Úexeczraise ImportError: é)rbr+Ú load_packagercr.ÚcompileÚreadr2rÚ_bootstrap_externalÚ _classify_pycr rZÚmarshalÚloadsÚ memoryviewÚ add_moduler=rPÚreplace_paths_in_coder?Ú scan_code) rBr›rhrgÚ file_infor9ÚmodeÚtyperxÚcoÚdataÚexcrrrrfNs4     zModuleFinder.load_modulecCs<||jkri|j|<|r*d|j||j<nd|j|d<dS)Nrú-)rLr<)rBrrsrrrÚ_add_badmoduleks   zModuleFinder._add_badmodulec CsB||jkr| ||¡dSz|j|||d�Wn~tk rn}z"| ddt|ƒ¡| ||¡W5d}~XYnÐtk r¬}z"| ddt|ƒ¡| ||¡W5d}~XYn’X|�r>|D]„}|d|}||jkrà| ||¡q¸z|j|||g|d�Wq¸tk �r:}z"| ddt|ƒ¡| ||¡W5d}~XYq¸Xq¸dS)Nrnrz ImportError:z SyntaxError:rz)rLr°rmr r^rZÚ SyntaxError)rBrrsrtrYr^rŠÚfullnamerrrÚ_safe_import_hookss,     zModuleFinder._safe_import_hookc csô|j}|j}|j}dd„t |¡Dƒ}t|ƒD]À\}\}}|tkrTd||ffVq.|tkr.|dkr.||dd||ddkr�tkr.nq.|||dd} |||dd} | dkrØd| ||ffVq.d| | ||ffVq.q.dS) NcSs"g|]\}}}|tkr||f‘qSr)Ú EXTENDED_ARG)Ú.0Ú_Úopr]rrrÚ ’sÿz-ModuleFinder.scan_opcodes..ÚstorerrrÚabsolute_importÚrelative_import) Úco_codeÚco_namesÚ co_constsÚdisZ_unpack_opargsÚ enumerateÚ STORE_OPSrr) rBr¬Úcoder”ÚconstsZopargsr\r·ZopargrYrtrrrÚ scan_opcodes�s(ÿÿ zModuleFinder.scan_opcodescCsŒ|j}|j}||ƒD�]F\}}|dkr8|\}d|j|<q|dk�r|\}}d} |dk rpd|krbd} dd„|Dƒ}|j|||dd�| �r\d} |jr¨|j |jd |¡} | dkr¼|j |¡} | dk rö|j | j¡|j  | j ¡| j dkrôd|j |<n d|j |<q|d k�rT|\} }}|�r0|j|||| d�n"|j || d�} |j| jd|dd�qt |ƒ‚q|j D]"} t| t|ƒƒ�rd| | |¡�qddS) Nr¹rrºrr†cSsg|]}|dkr|‘qS)r†r)rµÚfrrrr¸¯sz*ModuleFinder.scan_code..rnrzr»)r¼rÄr@r³r>rKÚgetr<ÚupdaterAr?roÚ RuntimeErrorr¾r,r«r¨)rBr¬rxrÂÚscannerZwhatr[rrtZ have_starZmmrYruÚcrrrr¨¢sH          zModuleFinder.scan_codecCsœ| dd||¡t |¡}|r"|}| |¡}||_|g|_|jt |g¡|_| d|j¡\}}}z&|  ||||¡|  dd|¡|W¢S|r–| ¡XdS)NrržrCzload_package ->) rbrrÆr¦r=r>r r˜r™rfrc)rBr›rgrrxrhZbufrirrrržÓs  zModuleFinder.load_packagecCs*||jkr|j|St|ƒ|j|<}|Sr )rKr;)rBr›rxrrrr¦ès  zModuleFinder.add_modulecCsn|dk r|jd|}n|}||jkr<| dd|¡t|ƒ‚|dkrd|tjkr^ddddtffS|j}t||ƒS)Nrzrzfind_module -> Excludedr) r<rOrcr rJÚbuiltin_module_namesr$rr:)rBrrrur²rrrr˜îs  zModuleFinder.find_modulecCstƒtddƒtddƒt|j ¡ƒ}|D]B}|j|}|jrRtddd�n tddd�td||jpnd ƒq0| ¡\}}|rÂtƒtd ƒ|D]*}t|j| ¡ƒ}td |d d  |¡ƒq–|�rtƒtddd�tdƒ|D]*}t|j| ¡ƒ}td |d d  |¡ƒqædS)z’Print a report to stdout, listing the found modules with their paths, as well as modules that are missing, or seem to be missing. z %-25s %s)ÚNameZFile)ú----rÍÚPrSrTrxz%-25srzMissing modules:ú?z imported fromz, z7Submodules that appear to be missing, but could also bez#global names in the parent package:N) rWÚsortedrKr’r>r=Úany_missing_mayberLr})rBr’ÚkeyrxÚmissingÚmayberZmodsrrrÚreports0      zModuleFinder.reportcCs| ¡\}}||S)z½Return a list of modules that appear to be missing. Use any_missing_maybe() if you want to know which modules are certain to be missing, and which *may* be missing. )rÑ)rBrÓrÔrrrÚ any_missing"s zModuleFinder.any_missingcCsÔg}g}|jD]¬}||jkrq| d¡}|dkr<| |¡q||dd…}|d|…}|j |¡}|dk r°||j|kr†| |¡qº||jkr’qº|jr¤| |¡qº| |¡q| |¡q| ¡| ¡||fS)a®Return two lists, one with modules that are certainly missing and one with modules that *may* be missing. The latter names could either be submodules *or* just global names in the package. The reason it can't always be determined is that it's impossible to tell which names are imported when "from module import *" is done with an extension module, short of actually importing it. rzrrN) rLrOr~rrKrÆr@rAÚsort)rBrÓrÔrr\rŒZpkgnameZpkgrrrrÑ*s0            zModuleFinder.any_missing_maybecCsâtj |j¡}}|jD]*\}}| |¡r||t|ƒd…}qDq|jr�||jkr�||krr|  dd||f¡n|  dd|f¡|j  |¡t |j ƒ}t t|ƒƒD](}t||t|ƒƒr¦| ||¡||<q¦|jt|ƒ|d�S)Nrzco_filename %r changed to %rz co_filename %r remains unchanged)r¾Ú co_filename)r)rÚnormpathrØrPÚ startswithr…rMrQrcrÚlistr¾rVr,r«r§ÚreplaceÚtuple)rBr¬Z new_filenameZoriginal_filenamerÅÚrrÃr\rrrr§Xs& ÿÿ  z"ModuleFinder.replace_paths_in_code)NrNN)NNr)r)r)r)N)r<rGrHrCr^rbrcrdrlrmrorprqrrr‡rƒrfr°r³rÄr¨ržr¦r˜rÕrÖrÑr§rrrrrI|s2   #   1 ".rIc Cs¾ddl}z| tjdd…d¡\}}Wn2|jk rX}zt|ƒWY¢dSd}~XYnXd}d}g}g}|D]Z\}} |dkr†|d}|dkr’d}|dkrª||  tj¡}|dkr¶d}|dkrn| | ¡qn|sÔd } n|d} tj dd…} tj   | ¡| d<|| } |dk�r.td ƒ| D]} td t | ƒƒ�qt | ||ƒ} |dd…D]`}|dk�r\d}�qF|�rš|d d…d k�rŽ|   |dd …ddg¡n |   |¡n |  |¡�qF|  | ¡|  ¡| S)Nrrzdmp:qx:z-dz-mz-pz-qz-xzhello.pyzpath:rRéþÿÿÿz.*r†)ÚgetoptrJÚargvÚerrorrWrjr)Úpathseprrr*rXrIrmrlrdrÕ)ràZoptsr[r^rMZdomodsZaddpathZexcludeÚoÚaZscriptrÚitemÚmfr]rrrÚtestpsX       rèrez [interrupted])N)%Ú__doc__r¿Zimportlib._bootstrap_externalrÚimportlib.machineryr£r)r4rJÚtypesÚwarningsZopmaprrrrrÁr´r3r.r2r0r+r$r&r rrrr:r;rIrèr<rçÚKeyboardInterruptrWrrrrÚsL     -w;