grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026 ”qc-Zã@s}dZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z e j ƒ�!e j de ƒddlZWdQRXejdZejdZejdZejdZeefZejZiZdd „ZiZd d „ZGd d „d ƒZGdd„dƒZdd„Zedkryy eƒZWnek rxe dƒYnXdS)z3Find modules used by a script, using introspection.éNÚignoreÚ LOAD_CONSTÚ IMPORT_NAMEÚ STORE_NAMEÚ STORE_GLOBALcCstj|gƒj|ƒdS)N)ÚpackagePathMapÚ setdefaultÚappend)Z packagenameÚpath©r ú1/opt/alt/python35/lib64/python3.5/modulefinder.pyÚAddPackagePath sr cCs|t|s zModule.__repr__)rÚ __module__Ú __qualname__rrr r r r r/s  rc@sceZdZddggdd„Zdd„Zdd„Zd d „Zd d „Zd d„Zddd6dd„Z d7dd„Z dd„Z dd„Z ddd„Z dd„Zdd„Zdd„Zd d!„Zd8d"d#„Zejd$d%„Zd&d'„Zd(d)„Zd*d+„Zdd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„ZdS)9Ú ModuleFinderNrcCsa|dkrtj}||_i|_i|_||_d|_||_||_g|_dS)Nr) Úsysr ÚmodulesÚ badmodulesÚdebugÚindentÚexcludesÚ replace_pathsÚprocessed_paths)rr r%r'r(r r r rIs         zModuleFinder.__init__cGs{||jkrwx't|jƒD]}tdddƒqWt|ddƒx$|D]}tt|ƒddƒqPWtƒdS)Nz Úendú )r%Úranger&ÚprintÚrepr)rÚlevelÚstrÚargsÚiÚargr r r ÚmsgUs zModuleFinder.msgcGs:|d}||jkr6|jd|_|j|ŒdS)Nré)r%r&r4)rr1r/r r r Úmsgin^s zModuleFinder.msgincGs:|d}||jkr6|jd|_|j|ŒdS)Nrr5)r%r&r4)rr1r/r r r Úmsgoutds zModuleFinder.msgoutc CsU|jdd|ƒt|ƒ�/}ddtjf}|jd|||ƒWdQRXdS)NéÚ run_scriptÚÚrÚ__main__)r4ÚopenÚimpÚ PY_SOURCEÚ load_module)rÚpathnameÚfpÚstuffr r r r9jszModuleFinder.run_scriptc Csrtjj|ƒ\}}tjj|ƒ\}}t|ƒ�/}|dtjf}|j||||ƒWdQRXdS)Nr;)Úosr ÚsplitÚsplitextr=r>r?r@)rrAÚdirrZextrBrCr r r Ú load_fileps zModuleFinder.load_filer5c Cs‚|jdd||||ƒ|j|d|ƒ}|j||ƒ\}}|j||ƒ}|se|S|jr~|j||ƒdS)NéÚ import_hookr/)r4Údetermine_parentÚfind_head_packageÚ load_tailrÚensure_fromlist) rrÚcallerÚfromlistr/ÚparentÚqÚtailÚmr r r rJws zModuleFinder.import_hookcCs�|jdd||ƒ| s)|dkr=|jddƒdS|j}|dkrý|jre|d8}|dkr•|j|}|jdd|ƒ|S|jdƒ|kr¶tdƒ‚dj|jdƒd| …ƒ}|j|}|jdd|ƒ|S|jr*|j|}|jdd|ƒ|Sd|kry|j dƒ}|d|…}|j|}|jdd|ƒ|S|jddƒdS) NérKrzdetermine_parent -> Noner5zdetermine_parent ->Ú.zrelative importpath too deep) r6r7rrr#ÚcountÚ ImportErrorÚjoinrEÚrfind)rrOr/ZpnamerQr2r r r rK‚s<       #     zModuleFinder.determine_parentcCs;|jdd||ƒd|krX|jdƒ}|d|…}||dd…}n |}d}|r€d|j|f}n|}|j|||ƒ}|rÄ|jdd||fƒ||fS|r|}d}|j|||ƒ}|r|jdd||fƒ||fS|jdd|ƒtd |ƒ‚dS) NrUrLrVr5r:z%s.%szfind_head_package ->z"raise ImportError: No module namedzNo module named )r6ÚfindrÚ import_moduler7rX)rrQrr2ÚheadrSZqnamerRr r r rL¥s.   zModuleFinder.find_head_packagecCsÝ|jdd||ƒ|}x§|rÅ|jdƒ}|dkrLt|ƒ}|d|…||dd…}}d|j|f}|j|||ƒ}|s|jdd|ƒtd|ƒ‚qW|jdd |ƒ|S) NrUrMrVrr5z%s.%sz"raise ImportError: No module namedzNo module named z load_tail ->)r6r[Úlenrr\r7rX)rrRrSrTr2r]Zmnamer r r rMÀs  %zModuleFinder.load_tailcCs¸|jdd|||ƒx˜|D]�}|dkrc|s°|j|ƒ}|r°|j||dƒq t||ƒs d|j|f}|j|||ƒ}|s td|ƒ‚q WdS)NrUrNÚ*r5z%s.%szNo module named )r4Úfind_all_submodulesrNÚhasattrrr\rX)rrTrPZ recursiveÚsubÚallÚsubnameZsubmodr r r rNÏs  zModuleFinder.ensure_fromlistc Cs<|js dSi}g}|tjjdd…7}|tjjdd…7}|tjjdd…7}xÈ|jD]½}ytj|ƒ}Wn(tk r´|j dd|ƒwqYnXxv|D]n}d}xC|D];}t |ƒ} || d…|krÏ|d| …}PqÏW|r¼|dkr¼|||YnX|jdd|ƒ|S||jkry|jddƒdS|r¢|jdkr¢|jddƒdSy+|j||oº|j|ƒ\}}}Wn)tk rø|jdddƒdSYnXz|j||||ƒ}Wd|r(|j ƒX|r?t |||ƒ|jdd|ƒ|S)NrIr\zimport_module ->zimport_module -> None) r6r#ÚKeyErrorr7r$rÚ find_modulerXr@ÚcloseÚsetattr)rZpartnameÚfqnamerQrTrBrArCr r r r\ùs6  "   zModuleFinder.import_modulec Cs…|\}}}|jdd||o'd|ƒ|tjkrf|j||ƒ}|jdd|ƒ|S|tjkr”t|jƒd|dƒ} n‹|tjkryt j j |jƒƒ} WnEt k r} z%|jddt | ƒ|ƒ‚WYdd} ~ XnXtj| ƒ} nd} |j|ƒ}||_| rn|jrU|j| ƒ} | |_|j| |ƒ|jdd|ƒ|S)Nr8r@rBzload_module ->Ú Úexeczraise ImportError: )r6r>Z PKG_DIRECTORYÚ load_packager7r?ÚcompileÚreadZ PY_COMPILEDreÚ_bootstrap_externalÚ_validate_bytecode_headerrXr0ÚmarshalÚloadsÚ add_modulerr(Úreplace_paths_in_coderÚ scan_code) rrurBrAÚ file_infoÚsuffixÚmodeÚtyperTÚcoZ marshal_dataÚexcr r r r@s2   zModuleFinder.load_modulecCsN||jkri|j|<|r9d|j||jYs z0ModuleFinder.scan_opcodes_25..Ústorer8r5rÚabsolute_importÚrelative_import) Úco_codeÚco_namesÚ co_constsÚdisZ_unpack_opargsÚ enumerateÚ STORE_OPSrr) rr†ÚunpackÚcodernÚconstsZopargsr2r�Zopargr/rPr r r Úscan_opcodes_25Ss     4 zModuleFinder.scan_opcodes_25cCs'|j}|j}xÕ||ƒD]Ç\}}|dkrP|\}d|j|.r/rVr“)r”r�rr‹rr#ÚgetrÚupdaterrrKÚ RuntimeErrorr–Ú isinstancer…r�)rr†rTr›ÚscannerZwhatr1rrPZ have_starZmmr/rQÚcr r r r�isH            zModuleFinder.scan_codec CsØ|jdd||ƒtj|ƒ}|r1|}|j|ƒ}||_|g|_|jtj|gƒ|_|jd|jƒ\}}}z1|j||||ƒ|j dd|ƒ|SWd|rÓ|j ƒXdS)Nr8rxrzload_package ->) r6rrŸrrrrrrr@r7rs)rrurArrTrBZbufrCr r r rxšs  zModuleFinder.load_packagecCs5||jkr|j|St|ƒ|j|<}|S)N)r#r)rrurTr r r r¯s zModuleFinder.add_modulecCs¡|dk r |jd|}n|}||jkrT|jdd|ƒt|ƒ‚|dkr‘|tjkrˆddddtjffS|j}tj ||ƒS)NrVrIzfind_module -> Excludedr:) rr'r7rXr"Úbuiltin_module_namesr>Z C_BUILTINr rr)rrr rQrŠr r r rrµs    zModuleFinder.find_modulecCs|tƒtddƒtddƒt|jjƒƒ}xa|D]Y}|j|}|jrntdddƒntdddƒtd ||jp”d ƒq?W|jƒ\}}|r tƒtd ƒxC|D];}t|j|jƒƒ}td |d dj|ƒƒqÌW|rxtƒtdddƒtdƒxC|D];}t|j|jƒƒ}td |d dj|ƒƒq9WdS)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ÚNameÚFileú----ÚPr*r+rTz%-25sr:zMissing modules:ú?z imported fromz, z7Submodules that appear to be missing, but could also bez#global names in the parent package:N)r¦r§)r¨r¨) r-Úsortedr#rlrrÚany_missing_mayber$rY)rrlÚkeyrTÚmissingÚmayberZmodsr r r ÚreportÆs0        zModuleFinder.reportcCs|jƒ\}}||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¬)rr®r¯r r r Ú any_missingèszModuleFinder.any_missingcCs(g}g}xû|jD]ð}||jkr.q|jdƒ}|dkrY|j|ƒq||dd…}|d|…}|jj|ƒ}|dk rù||j|kr¾|j|ƒq||jkrÐq|jré|j|ƒq|j|ƒq|j|ƒqW|jƒ|jƒ||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. rVrr5N) r$r'rZr r#rŸrrÚsort)rr®r¯rr2rdZpkgnameZpkgr r r r¬ðs0       zModuleFinder.any_missing_maybecCs…tjj|jƒ}}xA|jD]6\}}|j|ƒr#||t|ƒd…}Pq#W|jrÅ||jkrÅ||krž|j dd||fƒn|j dd|fƒ|jj |ƒt |j ƒ}xJt t|ƒƒD]6}t||t|ƒƒrç|j||ƒ||Zopmaprrrrr™rŒrr rrrr!rÑrrÐÚKeyboardInterruptr-r r r r Ús>                  ÿõ ;