Fa-Z@s}dZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z e j !e j de ddlZWdQRXejdZejdZejdZejdZeefZejZiZdd ZiZd d ZGd d d ZGdddZddZedkryy eZWnek rxe dYnXdS)z3Find modules used by a script, using introspection.Nignore LOAD_CONST IMPORT_NAME STORE_NAME STORE_GLOBALcCstj|gj|dS)N)packagePathMap setdefaultappend)Z packagenamepathr "/usr/lib/python3.5/modulefinder.pyAddPackagePath sr cCs|t|s zModule.__repr__)r __module__ __qualname__rrr r r r r/s  rc@sceZdZddggddZddZddZd d Zd d Zd dZddd6ddZ d7ddZ ddZ ddZ dddZ ddZddZddZd d!Zd8d"d#Zejd$d%Zd&d'Zd(d)Zd*d+Zdd,d-Zd.d/Zd0d1Zd2d3Zd4d5ZdS)9 ModuleFinderNrcCsa|dkrtj}||_i|_i|_||_d|_||_||_g|_dS)Nr) sysr modules badmodulesdebugindentexcludes replace_pathsprocessed_paths)rr r%r'r(r r r rIs         zModuleFinder.__init__cGs{||jkrwx't|jD]}tdddqWt|ddx$|D]}tt|ddqPWtdS)Nz end )r%ranger&printrepr)rlevelstrargsiargr 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_scriptr__main__)r4openimp PY_SOURCE load_module)rpathnamefpstuffr r r r9jszModuleFinder.run_scriptc Csrtjj|\}}tjj|\}}t|/}|dtjf}|j||||WdQRXdS)Nr;)osr splitsplitextr=r>r?r@)rrAdirrZextrBrCr r r load_fileps zModuleFinder.load_filer5c Cs|jdd|||||j|d|}|j||\}}|j||}|se|S|jr~|j||dS)N import_hookr/)r4determine_parentfind_head_package load_tailrensure_fromlist) rrcallerfromlistr/parentqtailmr r r rJws zModuleFinder.import_hookcCs|jdd||| s)|dkr=|jdddS|j}|dkr|jre|d8}|dkr|j|}||kst|jdd||S|jd|krtddj|j dd| }|j|}|jdd||S|jrN|j|}||ks7t|jdd||Sd|kr|j d}|d|}|j|}|j|kst|jdd||S|jdddS) NrKrzdetermine_parent -> Noner5zdetermine_parent ->.zrelative importpath too deep) r6r7rrr#AssertionErrorcount ImportErrorjoinrErfind)rrOr/ZpnamerQr2r r r rKsB       #     zModuleFinder.determine_parentcCs;|jdd||d|krX|jd}|d|}||dd}n |}d}|rd|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 )r6findr import_moduler7rY)rrQrr2headrSZqnamerRr r r rLs.   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]r7rY)rrRrSrTr2r^Zmnamer r r rMs  %zModuleFinder.load_tailcCs|jdd|||x|D]}|dkrc|s|j|}|r|j||dq t||s d|j|f}|j|||}|s td|q WdS)NrUrN*r5z%s.%szNo module named )r4find_all_submodulesrNhasattrrr]rY)rrTrPZ recursivesuballsubnameZsubmodr r r rNs  zModuleFinder.ensure_fromlistc Cs<|js dSi}g}|tjjdd7}|tjjdd7}|tjjdd7}x|jD]}ytj|}Wn(tk r|j dd|wqYnXxv|D]n}d}xC|D];}t |} || d|kr|d| }PqW|r|dkr|||YnX|jdd||S||jkry|jdddS|r|jdkr|jdddSy+|j||o|j|\}}}Wn)tk r|jddddSYnXz|j||||}Wd|r(|j X|r?t ||||jdd||S)NrIr]zimport_module ->zimport_module -> None) r6r#KeyErrorr7r$r find_modulerYr@closesetattr)rZpartnamefqnamerQrTrBrArCr r r r]s6  "   zModuleFinder.import_modulec Cs|\}}}|jdd||o'd||tjkrf|j||}|jdd||S|tjkrt|jd|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?compilereadZ PY_COMPILEDrf_bootstrap_external_validate_bytecode_headerrYr0marshalloads add_modulerr(replace_paths_in_coder scan_code) rrvrBrA file_infosuffixmodetyperTcoZ marshal_dataexcr r r r@s2   zModuleFinder.load_modulecCsN||jkri|j|<|r9d|j||jYs z0ModuleFinder.scan_opcodes_25..storer8r5rabsolute_importrelative_import) co_codeco_names co_constsdisZ_unpack_opargs enumerate STORE_OPSrr) rrunpackcoderoconstsZopargsr2rZopargr/rPr r r scan_opcodes_25Ss     4 zModuleFinder.scan_opcodes_25cCs'|j}|j}x||D]\}}|dkrP|\}d|j|.r/rVr)rrrrrr#getrupdaterrrK RuntimeErrorr isinstancerr)rrrTrscannerZwhatr1rrPZ have_starZmmr/rQcr r r risH            zModuleFinder.scan_codec Cs|jdd||tj|}|r1|}|j|}||_|g|_|jtj|g|_|jd|j\}}}z1|j|||||j dd||SWd|r|j XdS)Nr8ryrzload_package ->) r6rrrrrrrsr@r7rt)rrvrArrTrBZbufrCr r r rys  zModuleFinder.load_packagecCs5||jkr|j|St||j|<}|S)N)r#r)rrvrTr r r rs zModuleFinder.add_modulecCs|dk r |jd|}n|}||jkrT|jdd|t||dkr|tjkrddddtjffS|j}tj ||S)NrVrIzfind_module -> Excludedr:) rr'r7rYr"builtin_module_namesr>Z C_BUILTINr rs)rrr rQrr r r rss    zModuleFinder.find_modulecCs|ttddtddt|jj}xa|D]Y}|j|}|jrntdddntdddtd ||jpd q?W|j\}}|r ttd xC|D];}t|j|j}td |d dj|qW|rxttdddtdxC|D];}t|j|j}td |d dj|q9WdS)zPrint 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 %sNameFile----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)rr)rr) r-sortedr#rmrrany_missing_mayber$rZ)rrmkeyrTmissingmayberZmodsr r r reports0        zModuleFinder.reportcCs|j\}}||S)zReturn 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)rrrr r r any_missingszModuleFinder.any_missingcCs(g}g}x|jD]}||jkr.q|jd}|dkrY|j|q||dd}|d|}|jj|}|dk r||j|kr|j|q||jkrq|jr|j|q|j|q|j|qW|j|j||fS)aReturn 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'r[r r#rrrsort)rrrrr2reZpkgnameZpkgr r r rs0       zModuleFinder.any_missing_maybecCstjj|j}}xA|jD]6\}}|j|r#||t|d}Pq#W|jr||jkr||kr|j dd||fn|j dd|f|jj |t |j }xJt t|D]6}t||t|r|j||||Zopmaprrrrrrrr rrrr!rrrKeyboardInterruptr-r r r r s>                   ;