3
ebY                 @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
e
j  e
jde ddlZW dQ R X ejd Zejd Zejd Zejd ZeefZejZi Zdd	 Zi Zd
d ZG dd dZG dd dZdd Zedkry
e ZW n ek
r   e d Y nX dS )z3Find modules used by a script, using introspection.    Nignore
LOAD_CONSTIMPORT_NAME
STORE_NAMESTORE_GLOBALc             C   s   t j| g j| d S )N)packagePathMap
setdefaultappend)Zpackagenamepath r   "/usr/lib/python3.6/modulefinder.pyAddPackagePath    s    r   c             C   s   |t | < d S )N)replacePackageMap)Zoldnamenewnamer   r   r   ReplacePackage+   s    r   c               @   s   e Zd ZdddZdd ZdS )ModuleNc             C   s(   || _ || _|| _d | _i | _i | _d S )N)__name____file____path____code__globalnamesstarimports)selfnamefiler
   r   r   r   __init__1   s    zModule.__init__c             C   sL   d| j f }| jd k	r&|d| jf  }| jd k	r@|d| jf  }|d }|S )Nz	Module(%rz, %r))r   r   r   )r   sr   r   r   __repr__>   s    

zModule.__repr__)NN)r   
__module____qualname__r   r   r   r   r   r   r   /   s   
r   c               @   s   e Zd Zddg g fddZdd Zdd Zd	d
 Zdd Zdd Zd7ddZ	d9ddZ
dd Zdd Zd:ddZdd Zdd Zdd Zd d! Zd<d"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zd=d,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 ZdS )>ModuleFinderNr   c             C   sB   |d krt j}|| _i | _i | _|| _d| _|| _|| _g | _d S )Nr   )	sysr
   modules
badmodulesdebugindentexcludesreplace_pathsprocessed_paths)r   r
   r%   r'   r(   r   r   r   r   I   s    zModuleFinder.__init__c             G   s^   || j krZxt| jD ]}tddd qW t|dd x|D ]}tt|dd q<W t  d S )Nz    )end)r%   ranger&   printrepr)r   levelstrargsiargr   r   r   msgU   s    

zModuleFinder.msgc             G   s,   |d }|| j kr(| jd | _| j|  d S )Nr      )r%   r&   r4   )r   r1   r/   r   r   r   msgin^   s    
zModuleFinder.msginc             G   s,   |d }|| j kr(| jd | _| j|  d S )Nr   r5   )r%   r&   r4   )r   r1   r/   r   r   r   msgoutd   s    
zModuleFinder.msgoutc             C   sB   | j dd| t|"}ddtjf}| jd||| W d Q R X d S )N   
run_script r__main__)r4   openimp	PY_SOURCEload_module)r   pathnamefpstuffr   r   r   r9   j   s    
zModuleFinder.run_scriptc             C   sT   t jj|\}}t jj|\}}t|"}|dtjf}| j|||| W d Q R X d S )Nr;   )osr
   splitsplitextr=   r>   r?   r@   )r   rA   dirr   ZextrB   rC   r   r   r   	load_filep   s
    
zModuleFinder.load_filer5   c       	      C   s\   | j dd|||| | j||d}| j||\}}| j||}|sF|S |jrX| j|| d S )N   import_hook)r/   )r4   determine_parentfind_head_package	load_tailr   ensure_fromlist)	r   r   callerfromlistr/   parentqtailmr   r   r   rJ   w   s    zModuleFinder.import_hookc             C   sP  | j dd|| | s|dkr.| jdd d S |j}|dkr|jrJ|d8 }|dkrz| j| }||ksht| jdd| |S |jd|k rtddj|j	dd |  }| j| }| jdd| |S |jr| j| }||kst| jdd| |S d|kr@|j
d}|d | }| j| }|j|ks.t| jdd| |S | jdd d S )	N   rK   r   zdetermine_parent -> Noner5   zdetermine_parent ->.zrelative importpath too deep)r6   r7   r   r   r#   AssertionErrorcountImportErrorjoinrE   rfind)r   rO   r/   ZpnamerQ   r2   r   r   r   rK      sB    





zModuleFinder.determine_parentc             C   s   | j dd|| d|kr@|jd}|d | }||d d  }n|}d}|r\d|j|f }n|}| j|||}|r| jdd||f ||fS |r|}d }| j|||}|r| jdd||f ||fS | jdd| td	| d S )
NrU   rL   rV   r5   r:   z%s.%szfind_head_package ->z"raise ImportError: No module namedzNo module named )r6   findr   import_moduler7   rY   )r   rQ   r   r2   headrS   ZqnamerR   r   r   r   rL      s.    
zModuleFinder.find_head_packagec             C   s   | j dd|| |}xz|r|jd}|dk r4t|}|d | ||d d   }}d|j|f }| j|||}|s| jdd| td| qW | jdd	| |S )
NrU   rM   rV   r   r5   z%s.%sz"raise ImportError: No module namedzNo module named zload_tail ->)r6   r\   lenr   r]   r7   rY   )r   rR   rS   rT   r2   r^   Zmnamer   r   r   rM      s    
 zModuleFinder.load_tailc             C   s   | j dd||| xl|D ]d}|dkrF|s|| j|}|r|| j||d qt||sd|j|f }| j|||}|std| qW d S )NrU   rN   *r5   z%s.%szNo module named )r4   find_all_submodulesrN   hasattrr   r]   rY   )r   rT   rP   	recursivesuballsubnameZsubmodr   r   r   rN      s    


zModuleFinder.ensure_fromlistc       
      C   s   |j s
d S i }g }|tjjd d  7 }|tjjd d  7 }|tjjd d  7 }x|j D ]}ytj|}W n$ tk
r   | j	dd| wVY nX x\|D ]T}d }x6|D ].}t
|}	||	 d  |kr|d |	  }P qW |r|dkr|||< qW qVW |j S )Nr8   zcan't list directoryr   )r   	importlib	machineryEXTENSION_SUFFIXESSOURCE_SUFFIXESBYTECODE_SUFFIXESrD   listdirOSErrorr4   r_   keys)
r   rT   r#   suffixesrG   namesr   modZsuffnr   r   r   ra      s.    

z ModuleFinder.find_all_submodulesc             C   s  | j dd||| y| j| }W n tk
r4   Y nX | jdd| |S || jkrb| jdd d S |r|jd kr| jdd d S y| j||o|j|\}}}W n" tk
r   | jddd  d S X z| j||||}W d |r|j	  X |rt
||| | jdd| |S )NrI   r]   zimport_module ->zimport_module -> None)r6   r#   KeyErrorr7   r$   r   find_modulerY   r@   closesetattr)r   ZpartnamefqnamerQ   rT   rB   rA   rC   r   r   r   r]      s6    

zModuleFinder.import_modulec             C   s  |\}}}| j dd||od| |tjkrH| j||}| jdd| |S |tjkrht|j d |d}	nj|tjkryt	j
j|j }
W n: tk
r } z| jddt| |  W Y d d }~X nX tj|
}	nd }	| j|}||_|	r
| jr| j|	}	|	|_| j|	| | jdd| |S )Nr8   r@   rB   zload_module ->
execzraise ImportError: )r6   r>   ZPKG_DIRECTORYload_packager7   r?   compilereadZPY_COMPILEDrg   _bootstrap_external_validate_bytecode_headerrY   r0   marshalloads
add_moduler   r(   replace_paths_in_coder   	scan_code)r   rw   rB   rA   	file_infosuffixmodetyperT   coZmarshal_dataexcr   r   r   r@     s2    





zModuleFinder.load_modulec             C   s<   || j kri | j |< |r*d| j | |j< nd| j | d< d S )Nr5   -)r$   r   )r   r   rO   r   r   r   _add_badmodule4  s
    

zModuleFinder._add_badmodulec             C   s  || j kr| j|| d S y| j|||d W n@ tk
rn } z$| jddt| | j|| W Y d d }~X nX |rx|D ]}|| j kr| j|| q|y| j|||g|d W q| tk
r } z0| jddt| |d | }| j|| W Y d d }~X q|X q|W d S )N)r/   r8   zImportError:rV   )r$   r   rJ   rY   r4   r0   )r   r   rO   rP   r/   r4   rd   fullnamer   r   r   _safe_import_hook<  s&    


zModuleFinder._safe_import_hookc             c   s   |j }|j}|j}dd tj|D }xt|D ]\}\}}|tkrVd|| ffV  q0|tkr0|dkr0||d  d ||d  d   kotkn  r0|||d  d  }	|||d  d  }
|	dkrd|
|| ffV  q0d|	|
|| ffV  q0q0W d S )	Nc             S   s"   g | ]\}}}|t kr||fqS r   )EXTENDED_ARG).0_opr3   r   r   r   
<listcomp>X  s    z-ModuleFinder.scan_opcodes.<locals>.<listcomp>storer8   r5   r   absolute_importrelative_import)	co_codeco_names	co_constsdisZ_unpack_opargs	enumerate	STORE_OPSr   r   )r   r   coderp   constsZopargsr2   r   Zopargr/   rP   r   r   r   scan_opcodesS  s     0zModuleFinder.scan_opcodesc             C   s  |j }| j}xT||D ]F\}}|dkr<|\}d|j|< q|dkr|\}}d}	|d k	rtd|krfd}	dd |D }| j|||dd |	r`d }
|jr| jj|jd	 | }
|
d kr| jj|}
|
d k	r|jj|
j |j	j|
j	 |
j
d krd|j	|< n
d|j	|< q|d
krX|\}}}|r4| j||||d n"| j||d}| j|jd |dd qt|qW x,|jD ]"}t|t|rl| j|| qlW d S )Nr   r5   r   r   r`   c             S   s   g | ]}|d kr|qS )r`   r   )r   fr   r   r   r   u  s    z*ModuleFinder.scan_code.<locals>.<listcomp>)r/   rV   r   )r   r   r   r   r   r#   getr   updater   r   rK   RuntimeErrorr   
isinstancer   r   )r   r   rT   r   scannerZwhatr1   r   rP   Z	have_starZmmr/   rQ   cr   r   r   r   h  sH    



zModuleFinder.scan_codec             C   s   | j dd|| tj|}|r"|}| j|}||_|g|_|jtj|g  |_| jd|j\}}}z"| j|||| | j	dd| |S |r|j
  X d S )Nr8   rz   r   zload_package ->)r6   r   r   r   r   r   r   rt   r@   r7   ru   )r   rw   rA   r   rT   rB   ZbufrC   r   r   r   rz     s    

zModuleFinder.load_packagec             C   s*   || j kr| j | S t| | j |< }|S )N)r#   r   )r   rw   rT   r   r   r   r     s    

zModuleFinder.add_modulec             C   sr   |d k	r|j d | }n|}|| jkr<| jdd| t||d krf|tjkr`d d ddtjffS | j}tj	||S )NrV   rI   zfind_module -> Excludedr:   )
r   r'   r7   rY   r"   builtin_module_namesr>   Z	C_BUILTINr
   rt   )r   r   r
   rQ   r   r   r   r   rt     s    

zModuleFinder.find_modulec             C   s"  t   t dd  t dd  t| jj }xJ|D ]B}| j| }|jrTt ddd nt ddd t d	| |jppd
 q2W | j \}}|rt   t d x2|D ]*}t| j| j }t d|ddj| qW |rt   t ddd t d x2|D ]*}t| j| j }t d|ddj| qW dS )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 %sNameFile----Pr*   )r+   rT   z%-25sr:   zMissing 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#   rn   r   r   any_missing_mayber$   rZ   )r   rn   keyrT   missingmayber   Zmodsr   r   r   report  s0    



zModuleFinder.reportc             C   s   | 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   )r   r   r   r   r   r   any_missing  s    zModuleFinder.any_missingc             C   s   g }g }x| j D ]}|| jkr q|jd}|dk r>|j| q||d d }|d| }| jj|}|dk	r|| j | kr|j| q||jkrq|jr|j| q|j| q|j| qW |j  |j  ||fS )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.
        rV   r   r5   N)	r$   r'   r[   r	   r#   r   r   r   sort)r   r   r   r   r2   rf   ZpkgnameZpkgr   r   r   r     s0    	



zModuleFinder.any_missing_maybec             C   s  t jj|j }}x2| jD ](\}}|j|r||t|d   }P qW | jr|| jkr||krt| j	dd||f  n| j	dd|f  | jj
| t|j}x8tt|D ](}t|| t|r| j|| ||< qW tj|j|j|j|j|j|jt||j|j||j|j|j|j|j S )Nr8   zco_filename %r changed to %rz co_filename %r remains unchanged)!rD   r
   normpathco_filenamer(   
startswithr_   r%   r)   r7   r	   listr   r,   r   r   r   typesCodeTypeco_argcountco_kwonlyargcount
co_nlocalsco_stacksizeco_flagsr   tupler   co_varnamesco_nameco_firstlineno	co_lnotabco_freevarsco_cellvars)r   r   Znew_filenameZoriginal_filenamer   r;   r   r2   r   r   r   r     s,    



z"ModuleFinder.replace_paths_in_code)NNr   r   )r   )r   r   )r   )N)r   r   r    r   r4   r6   r7   r9   rH   rJ   rK   rL   rM   rN   ra   r]   r@   r   r   r   r   rz   r   rt   r   r   r   r   r   r   r   r   r!   G   s2   	

#

1
".r!   c              C   s  dd l } y| j tjdd  d\}}W n* | jk
rP } zt| d S d }~X nX d}d}g }g }xb|D ]Z\}}	|dkr|d }|dkrd}|dkr||	jtj }|dkrd}|dkrh|j|	 qhW |sd	}
n|d }
tj	d d  }tj	j
|
|d< || }|dkr.td
 x|D ]}tdt| qW t|||}xp|dd  D ]`}|dkr^d}qH|r|dd  dkr|j|d d d dg n
|j| n
|j| qHW |j|
 |j  |S )Nr   r5   zdmp:qx:z-dz-mz-pz-qz-xzhello.pyzpath:z   r8   z.*r`   r   )getoptr"   argverrorr-   rE   rD   pathsepr	   r
   dirnamer.   r!   rJ   rH   r9   r   )r   Zoptsr1   r4   r%   ZdomodsZaddpathZexcludeoaZscriptr
   itemmfr3   r   r   r   test:  sX    



r   r<   z
[interrupted])!__doc__r   importlib._bootstrap_externalrg   importlib.machineryr   rD   r"   r   Zstructwarningscatch_warningssimplefilterDeprecationWarningr>   Zopmapr   r   r   r   r   r   r   r   r   r   r   r!   r   r   r   KeyboardInterruptr-   r   r   r   r   <module>   sB   




   v;

