B
    d	                 @   s0   d Z d	ddZdd Zdd Zedkr,e  dS )
zRun Python code using ``mpi4py``.

Run Python code (scripts, modules, zip files) using the ``runpy``
module. In case of an unhandled exception, abort execution of the MPI
program by calling ``MPI.COMM_WORLD.Abort()``.
Nc                s  ddl  ddlm}m} d fdd	}| dk	r2| n jdd  jdd<  jd d	krt j }||d
dd	d n jd dkr jd}||d
ddd nv jd dkr̈ jd= | jd d
dd nJddlm	}m
} t jdds|| jd  jd< | jd d
d dS )ag  Run command line ``[pyfile | -m mod | -c cmd | -] [arg] ...``.

    * ``pyfile`` : program read from script file
    * ``-m mod`` : run library module as a script
    * ``-c cmd`` : program passed in as a command string
    * ``-``      : program read from standard input (``sys.stdin``)
    * ``arg ...``: arguments passed to program in ``sys.argv[1:]``
        N)
run_modulerun_path<string>-cc                sB   ddl m}  jdkrdnd}t| |ddd}||||f||iS )Nr   )_run_module_code)      script_nameZ	mod_fnameexec   )runpyr   version_infocompile)stringZinit_globalsrun_namefilenameargv0r   Zkargcode)sys W/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/mpi4py/run.py
run_string   s    z$run_command_line.<locals>.run_stringr   -__main__z<stdin>)r   r   r   z-mT)r   Z	alter_sys)realpathdirnameisolated)r   )NNr   r   )r   r   r   r   argvstdinreadpopos.pathr   r   getattrflagspath)argsr   r   r   cmdr   r   r   )r   r   run_command_line   s$    
 $
r'   c             C   sh   ddl }t| tr| n| dkr"dnd} tjp8tdd }|j|d }|dk	r`| r`|	|  |
 S )a  Terminate MPI execution environment at Python exit.

    Terminate MPI execution environment at Python exit by calling
    ``MPI.COMM_WORLD.Abort(status)``. This function should be called
    within an ``except`` block. Afterwards, exceptions should be
    re-raised.
    r   Nr   .z.MPI)r   
isinstanceint__spec__parent__name__
rpartitionmodulesgetZ_set_abort_statusexc_info)statusr   pkgZmpir   r   r   set_abort_status2   s    	
r4   c           
      s   ddl  ddltjfddd fdd	dfdd	} d	d
 }|  \}}|| yt| W nB tk
r } zt|j  W dd}~X Y n   td  Y nX dS )z-Entry-point for ``python -m mpi4py.run ...``.r   Nc                 s*   ddl m}  t | jd d d S )Nr   )__version__)filer   ) r5   printstdoutexit)r5   )packager   r   r   versionP   s    zmain.<locals>.versionc                s   ddl m} tdkrd }n} jj}t||d}|d jf |}|d jf |}|d }| rt	| j
d	 t	|j
d	 t	|j
d	 d
 n&t	|jd	 t	|jd	 d d S )Nr   )dedentr   z.run)progpythonz
        usage: {python} -m {prog} [options] <pyfile> [arg] ...
           or: {python} -m {prog} [options] -m <mod> [arg] ...
           or: {python} -m {prog} [options] -c <cmd> [arg] ...
           or: {python} -m {prog} [options] - [arg] ...
        zC
        Try `{python} -m {prog} -h` for more information.
        an  
        options:
          --version            show version number and exit
          -h|--help            show this help message and exit
          -rc <key=value,...>  set 'mpi4py.rc.key=value'
          -p|--profile <pmpi>  use <pmpi> for profiling
          --mpe                profile with MPE
          --vt                 profile with VampirTrace
        )r6   r   )textwrapr=   r-   r$   basename
executabledictstripformatr8   stderrr:   r9   )Zerrmessr=   Z	prog_nameZ
python_exesubsZcmdlineZhelptipoptions)osr;   r   r   r   usageU   s(    

zmain.<locals>.usagec          	      s,  G dd d}fdd}| }| d kr6 j dd  n
| d d  } x| r| d dr| d dkrjP | d d	kr|  | d d
kr  y,| d }|drd|kr|dd  d\}}}|dkr||g }| dd< n|dd  }|dkrnx|| dD ]`}|d\}	}}
|	r(|
s0t|yt|
i |j|	< W n  tk
rd   |
|j|	< Y nX qW nF|dkr|| pd |_n*|dkr|dd  |_nd| d   | d= W qF t	k
r   d| d   Y qFX qFW | sd n,| d dkr$t
| dk r$d| d   || fS )Nc               @   s   e Zd Zi ZdZdS )z1main.<locals>.parse_command_line.<locals>.OptionsN)r-   
__module____qualname__rc_argsprofiler   r   r   r   Options   s   rO   c                s4   t | dk s| d dr* d| d   | dS )N   r   r   zArgument expected for option: r   )len
startswithr    )r%   )rJ   r   r   poparg   s    z0main.<locals>.parse_command_line.<locals>.popargr   r   r   )z-mz-cr   )z-hz-helpz--help)z-versionz	--versionz--=)z-rcz-profilez-rc,)z-pz-profile)z-mpez-vtzUnknown option: zCannot parse option: zNo path specified for execution)z-mz-crP   zArgument expected for option: )r   rR   	partitionsplit
ValueErrorevalrM   	NameErrorrN   	ExceptionrQ   )r%   rO   rS   rH   Zarg0opt_argentrykeyval)r   rJ   r<   r   r   parse_command_line}   sR    "





z main.<locals>.parse_command_linec             S   s>   | j rddlm} |f | j  | jr:ddlm} || j d S )Nr   )rc)rN   )rM   r7   rc   rN   )rH   rc   rN   r   r   r   	bootstrap   s    zmain.<locals>.bootstrapr   )N)N)rI   r   r+   r,   r'   
SystemExitr4   r   )rb   rd   rH   r%   excr   )rI   r;   r   rJ   r<   r   mainF   s"    (:	

rg   r   )N)__doc__r'   r4   rg   r-   r   r   r   r   <module>   s   
' 
