grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026î   f}[ã@sÀdZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z e j ƒ�!e j de ƒddlZWdQXeejjdƒgƒZeejjdƒgƒZeejjdƒgƒZeejjdƒgƒZeegZeejgƒZiZdd „ZiZd d „ZGd d „d ƒZGdd„dƒZdd„Zedkr¼y eƒZ Wne!k r¸e"dƒYnXndS)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/python34/lib64/python3.4/modulefinder.pyÚAddPackagePath!sr cCs|t|r?r@)rrAÚdirrZextrBrCr r r Ú load_fileqs zModuleFinder.load_filer5c Cs…|jdd||||ƒ|j|d|ƒ}|j||ƒ\}}|j||ƒ}|se|S|jr�|j||ƒndS)NéÚ import_hookr/)r4Údetermine_parentÚfind_head_packageÚ load_tailrÚensure_fromlist) rrÚcallerÚfromlistr/ÚparentÚqÚtailÚmr r r rJxs zModuleFinder.import_hookcCs“|jdd||ƒ| s)|dkr=|jddƒdS|j}|dkr|jrh|d8}n|dkr˜|j|}|jdd|ƒ|S|jdƒ|kr¼tdƒ‚ndj|jdƒd| …ƒ}|j|}|jdd|ƒ|S|jr0|j|}|jdd|ƒ|Sd|kr|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ƒ||fSn|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ƒ}|dkrOt|ƒ}n|d|…||dd…}}d|j|f}|j|||ƒ}|s|jdd|ƒtd|ƒ‚qqW|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]œ}|dkri|s¼|j|ƒ}|rf|j||dƒqfq¼q t||ƒs d|j|f}|j|||ƒ}|s¼td|ƒ‚q¼q 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 CsB|js dSi}g}|tjjdd…7}|tjjdd…7}|tjjdd…7}xÎ|jD]Ã}ytj|ƒ}Wn(tk r´|j dd|ƒwqYnXx||D]t}d}xF|D]>}t |ƒ} || d…|krÏ|d| …}PqÏqÏ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 ƒnX|rEt |||ƒn|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|ƒ}||_| rt|jrX|j| ƒ} n| |_|j| |ƒn|jdd|ƒ|S)Nr8r@rBzload_module ->Ú Úexeczraise ImportError: )r6r>Z PKG_DIRECTORYÚ load_packager7r?ÚcompileÚreadZ PY_COMPILEDreÚ _bootstrapÚ_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_modulecCsQ||jkri|j|~s z*ModuleFinder.scan_code..r/rVr�)r�ršrr‹rr#ÚgetrÚupdaterrrKÚ RuntimeErrorr’Ú isinstancer…r�)rr†rTr—ÚscannerZwhatr1rrPZ have_starZmmr/rQr™r r r r�qsH              zModuleFinder.scan_codec CsÞ|jdd||ƒtj|ƒ}|r4|}n|j|ƒ}||_|g|_|jtj|gƒ|_|jd|jƒ\}}}z1|j||||ƒ|j dd|ƒ|SWd|rÙ|j ƒnXdS)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|}||jkrW|jdd|ƒt|ƒ‚n|dkr—|tjkr‹ddddtjffS|j}ntj ||ƒ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ƒ\}}|rtƒtd ƒxF|D];}t|j|jƒƒ}td |d dj|ƒƒqÌWn|r~tƒtdddƒtdƒxF|D];}t|j|jƒƒ}td |d dj|ƒƒq<WndS)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)zNamer¥)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]ö}||jkr1qn|jdƒ}|dkr_|j|ƒqn||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ƒ}}xD|jD]9\}}|j|ƒr#||t|ƒd…}Pq#q#W|jrË||jkrË||kr¡|j dd||fƒn|j dd|fƒ|jj |ƒnt |j ƒ}xMt t|ƒƒD]9}t||t|ƒƒrí|j||ƒ||r“ÚopnameÚindexrrrrr”r•rr rrrr!rÏrrÎÚKeyboardInterruptr-r r r r Ús>             ÿü ;