Spade
Mini Shell
3
\�.�@sdZddlZddlZddlZddlZddlmZmZddgZ Gdd�de
�ZGdd �d e
�Zd d
d�Z
d!dd
�Zefdd�ZGdd�de�Zd"dd�Zd#dd�Zefdd�Zdd�Zd$dd�Zedk�r�eej�dk�r�edejd�nejd=eejd�dS)%aZrunpy.py
- locating and running Python code using the module namespace
Provides support for locating and running Python scripts using the Python
module namespace instead of the native filesystem.
This allows Python code to play nicely with non-filesystem based PEP 302
importers when locating support scripts as well as when importing modules.
�N)� read_code�get_importer�
run_module�run_pathc@s(eZdZdZdd�Zdd�Zdd�ZdS) �_TempModulezCTemporarily
replace a module in sys.modules with an empty
namespacecCs||_tj|�|_g|_dS)N)�mod_name�types�
ModuleType�module�
_saved_module)�selfr�r
�/usr/lib64/python3.6/runpy.py�__init__sz_TempModule.__init__cCsB|j}y|jjtj|�Wntk
r0YnX|jtj|<|S)N)rr�append�sys�modules�KeyErrorr
)rrr
r
r� __enter__sz_TempModule.__enter__cGs.|jr|jdtj|j<n
tj|j=g|_dS)Nr)rrrr)r�argsr
r
r�__exit__'s
z_TempModule.__exit__N)�__name__�
__module__�__qualname__�__doc__rrrr
r
r
rrs rc@s$eZdZdd�Zdd�Zdd�ZdS)�_ModifiedArgv0cCs||_t�|_|_dS)N)�value�object�_saved_value� _sentinel)rrr
r
rr/sz_ModifiedArgv0.__init__cCs0|j|jk rtd��tjd|_|jtjd<dS)NzAlready
preserving saved
valuer)rr�RuntimeErrorr�argvr)rr
r
rr3sz_ModifiedArgv0.__enter__cGs|j|_|jtjd<dS)Nr)rrrrr!)rrr
r
rr9sz_ModifiedArgv0.__exit__N)rrrrrrr
r
r
rr.src
Csn|dk r|j|�|dkr(d}|}d} n
|j}|j}|j} |dkrH|j}|j||| d|||d�t||�|S)z)Helper
to run code in nominated namespaceN)r�__file__�
__cached__r�
__loader__�__package__�__spec__)�update�loader�origin�cached�parent�exec)
�codeZrun_globals�init_globalsr�mod_spec�pkg_name�script_namer(�fnamer*r
r
r� _run_code>s(
r3c Cs^|dkr|n|j}t|��6}t|��"|jj}t|||||||�WdQRXWdQRX|j�S)z5Helper
to run code in new namespace with sys modifiedN)r)rrr
�__dict__r3�copy) r-r.rr/r0r1r2�temp_module�mod_globalsr
r
r�_run_module_codeXs
r8c
;Cs4|jd�r|d��|jd�\}}}|r�yt|�WnJtk
r|}z.|jdksj|j|krl|j|jd�rl�WYdd}~XnXtjj|�}|dk r�t|d�r�ddl m
}dj||d�}|t|��yt
jj|�}WnJttttfk
�r} z$d}||j|t| �j| ��| �WYdd} ~ XnX|dk�r6|d |��|jdk �r�|d
k�sX|jd��r`|d��y|d}
t|
|�S|k
�r�}z$|tjk�r��|d||f��WYdd}~XnX|j}|dk�r�|d|��y|j|�}Wn2tk
�r}z|t|��|�WYdd}~XnX|dk�r*|d|��|||fS)N�.z#Relative
module names not supported�__path__r)�warnz�{mod_name!r} found in
sys.modules after import of package {pkg_name!r}, but prior to execution of
{mod_name!r}; this may result in unpredictable behaviour)rr0z:Error while
finding module specification for {!r} ({}: {})zNo module named
%s�__main__z .__main__z%Cannot use package as __main__ modulez%s; %r is
a package and cannot zbe directly executedz0%r is a namespace package and
cannot be executedzNo code object available for %sz3%s; %r is a package
and cannot be directly executed)�
startswith�
rpartition�
__import__�ImportError�namerr�get�hasattr�warningsr;�format�RuntimeWarning� importlib�util� find_spec�AttributeError� TypeError�
ValueError�typer�submodule_search_locations�endswith�_get_module_detailsr(�get_code)
r�errorr0�_�eZexistingr;�msg�specZexZ
pkg_main_namer(r-r
r
rrPfsZ
,
rPc@seZdZdZdS)�_ErrorzBError that _run_module_as_main()
should report without a
tracebackN)rrrrr
r
r
rrW�srWTcCs�y0|s|dkr
t|t�\}}}ntt�\}}}Wn:tk
rj}zdtj|f}tj|�WYdd}~XnXtjdj}|r�|jtj d<t
||dd|�S)a�Runs the designated module in the __main__ namespace
Note that the executed module will have full access to the
__main__ namespace. If this is not desirable, the run_module()
function should be used to run the module code in a fresh namespace.
At the very least, these variables in __main__ will be overwritten:
__name__
__file__
__cached__
__loader__
__package__
r<z%s: %sNr)rPrW�_get_main_module_detailsr�
executable�exitrr4r)r!r3)rZ
alter_argvr/r-�excrUZmain_globalsr
r
r�_run_module_as_main�sr\FcCs@t|�\}}}|dkr|}|r,t||||�St|i|||�SdS)znExecute
a module's code without importing it
Returns the resulting top level namespace dictionary
N)rPr8r3)rr.�run_nameZ alter_sysr/r-r
r
rr�scCs~d}tj|}tj|=zVyt|�Stk
rh}z,|t|�krV|d|tjdf�|��WYdd}~XnXWd|tj|<XdS)Nr<zcan't
find %r module in %rr)rrrPr@�str�path)rRZ main_nameZ
saved_mainr[r
r
rrX�s
rXcCsTt|d��}t|�}WdQRX|dkrLt|d��}t|j�|d�}WdQRX||fS)N�rbr,)�openr�compile�read)r]r2�fr-r
r
r�_get_code_from_file�srec
Cs|dkrd}|jd�d}t|�}d}t|�jdkrFt|�jdkrFd}t|td��sX|rxt||�\}}t|||||d �Stj j
d|�zRt�\}} }t|��4}
t
|�� |
jj}t||||| |�j�SQRXWdQRXWdytj j|�Wntk
�rYnXXdS)
a_Execute code located at the specified filesystem location
Returns the resulting top level namespace dictionary
The file path may refer directly to a Python script (i.e.
one that could be directly executed with execfile) or else
it may refer to a zipfile or directory containing a top
level __main__.py script.
Nz
<run_path>r9rFZimpZNullImporterT)r0r1)r>rrMrr�
isinstancerer8rr_�insertrXrrr
r4r3r5�removerL)Z path_namer.r]r0ZimporterZis_NullImporterr-r2rr/r6r7r
r
rr�s0
"r<�z!No module specified for
execution)�file)NNNNN)NNNNN)T)NNF)NN)rrZimportlib.machineryrG�importlib.utilrZpkgutilrr�__all__rrrr3r8r@rP� ExceptionrWr\rrXrerr�lenr!�print�stderrr
r
r
r�<module>s6
:
1