mò %U²Ic@s=dZdkZdkZdkZdkZdkZdkZeeidƒo dZ ndZ ei i dƒZ ei i dƒZ ei i dƒZei i dƒZeegZhZd „ZhZd „Zd fd „ƒYZd fd„ƒYZd„Zedjo,y eƒZWnej o dGHnXndS(s3Find modules used by a script, using introspection.NtnewlinestUtrt LOAD_CONSTt IMPORT_NAMEt STORE_NAMEt STORE_GLOBALcCs-ti|gƒ}|i|ƒ|t|R?RR@(RR9R<R?RRERC((R t load_filers cCsƒ|idd|||ƒ|i|ƒ}|i||ƒ\}}|i ||ƒ}|p|Sn|i o|i ||ƒndS(Nit import_hook(RR3Rtcallertfromlisttdetermine_parenttparenttfind_head_packagetqttailt load_tailtmRtensure_fromlistR(RRRHRIRKRPRMRN((R RGys cCsú|idd|ƒ|p|iddƒdSn|i}|io<|i|}||jpt ‚|idd|ƒ|Snd|joX|i dƒ}|| }|i|}|i|jpt ‚|idd|ƒ|Sn|iddƒdS(NiRJsdetermine_parent -> Nonesdetermine_parent ->t.( RR4RHR5RRtpnameRR%RKtAssertionErrortrfindR.(RRHRKR.RS((R RJ„s&      cCs?|idd||ƒd|jo+|idƒ}|| }||d}n |}d}|od|i|f}n|}|i |||ƒ}|o'|i dd||fƒ||fSn|oS|}d}|i |||ƒ}|o'|i dd||fƒ||fSqn|i dd|ƒtd |‚dS( NiRLRRiR7s%s.%ssfind_head_package ->s"raise ImportError: No module namedsNo module named (RR4RKRtfindR.theadRNRtqnamet import_moduleRMR5Rt ImportError(RRKRRWR.RXRMRN((R RL™s.  cCsÚ|idd||ƒ|}x¤|oœ|idƒ}|djot|ƒ}n|| ||d}}d|i |f}|i |||ƒ}|p$|i dd|ƒt d|‚qqW|i dd |ƒ|S( NiRORRiis%s.%ss"raise ImportError: No module namedsNo module named s load_tail ->(RR4RMRNRPRVR.tlenRWRtmnameRYR5RZ(RRMRNRWR.R\RP((R RO´s cCsË|idd|||ƒx«|D]£}|djo<|p1|i|ƒ}|o|i||dƒqkqÃq t ||ƒpDd|i |f}|i |||ƒ}|ptd|‚qÃq q WdS(NiRQt*is%s.%ssNo module named (RR3RPRIt recursivetsubtfind_all_submodulestallRQthasattrRtsubnameRYtsubmodRZ(RRPRIR^RaRcRdR_((R RQÃs c Cs|ipdSnh}g} x%tiƒD]}| i|dƒq+WxË|iD]À} yt i | ƒ}Wn,t i j o|idd| ƒqPnXxu|D]m}d}x<| D]4}t|ƒ}|| |jo|| }Pq²q²W|o|djo|||simport_module -> None(RR4tpartnametfqnameRKR%RPtKeyErrorR5R&thas_keyRRt find_moduleR<R9R?RZR@tclosetsetattr(RRoRpRKR<RPR?R9((R RYìs8 # c Cs‚|\}}}|idd||od|ƒ|ti jo-|i ||ƒ} |i dd| ƒ| Sn|ti jo t|iƒd|dƒ}nw|tijo`|idƒtiƒjo$|i dd|ƒtd |‚n|idƒti|ƒ}nd}|i|ƒ} || _|o:|io|i|ƒ}n|| _|i|| ƒn|i dd| ƒ| S( NiR@R<sload_module ->s texecis#raise ImportError: Bad magic numbersBad magic number in %s(tsuffixtmodettypeRR4RpR<R9R=t PKG_DIRECTORYt load_packageRPR5R>tcompiletreadtcot PY_COMPILEDt get_magicRZtmarshaltloadRt add_moduleRR*treplace_paths_in_codeRt scan_code( RRpR<R9t.8RwRxRyR~RP((R R@ s.      cCs9||ijoh|i|tj o2}|iddt|ƒƒ|i||ƒn®X|o¥x¢|D]–}||ijo|i||ƒq‹ny|i|||gƒWq‹tj o@}|iddt|ƒƒ|d|}|i||ƒq‹Xq‹WndS(Nis ImportError:RR( RRR&R‡RHRGRZR3R/RIR_tfullname(RRRHRIR3RˆR_((R t_safe_import_hook)s(cCs¡|i}t|ƒ} d} d}x;| | jo-|| }| d} t |ƒ}|t i jo4t || ƒt || dƒd}| d} n|tjo|i|}q$|tjoo|djpt|ƒtjpt‚|i|}d}|dj oMd|jo d}ng} |D]} | djo | | q)q)~ }n|i|||ƒ|o½d} |io!|ii|i d|ƒ} n| djo|ii|ƒ} n| dj oK|i!i"| i!ƒ|i#i"| i#ƒ| i$djod|i#|(RR4RpR9RRRRƒRPRRRRsR<tbufR?R@R5(RRpR9R<R?RRPRœ((R R{us   cCs=|ii|ƒo|i|Snt|ƒ|i|<}|S(N(RR%RrRpRRP(RRpRP((R Rƒ†scCs¯|dj o|id|}n|}||ijo |idd|ƒt|‚n|djo:|t i joddddt i ffSn|i }nt i||ƒS(NRRisfind_module -> ExcludedR7(RKRRRRˆRR)R5RZR R$tbuiltin_module_namesR=t C_BUILTINRs(RRR RKRˆ((R RsŒs    cCsCHddGHddGH|iiƒ}|iƒxH|D]@}|i|}|iodGndGd|G|ipdGHq3W|iƒ\}}|oRHd GHxI|D]=}|i |iƒ}|iƒd G|Gd Gd i|ƒGHqWn|oVHd GdGHxI|D]=}|i |iƒ}|iƒd G|Gd Gd i|ƒGHqúWndS(s’Print a report to stdout, listing the found modules with their paths, as well as modules that are missing, or seem to be missing. s %-25s %stNametFiles----tPRPs%-25sR7sMissing modules:t?s imported froms, s7Submodules thay appear to be missing, but could also bes#global names in the parent package:N(RŸR (s----s----(RR%RntsorttkeyRPRRtany_missing_maybetmissingtmaybeRR&tmodstjoin(RR¨RR¦RnR§RPR¤((R treports>      " cCs|iƒ\}}||S(s½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. N(RR¥R¦R§(RR§R¦((R t any_missingÂscCs.g}g}x|iD]ö}||ijoqn|idƒ}|djo|i|ƒqn||d}|| }|i i |ƒ}|dj oe||i|jo|i|ƒq ||ijoq |io|i|ƒq |i|ƒq|i|ƒqW|iƒ|iƒ||fS(s®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. RRiiN(R¦R§RR&RR)RUR.R RctpkgnameR%RtpkgRRRR£(RR¬RR¦R.R§RcR­((R R¥Ês4        cCs‹tii|iƒ}}x@|iD]5\}}|i |ƒo||t |ƒ}Pq#q#W|i of||ijoV||jo|idd||fƒn|idd|fƒ|ii|ƒnt|iƒ}xOtt |ƒƒD];}t||t|ƒƒo|i||ƒ||