U
    d                     @   s^   d dl Z d dlZd dlmZ d dlmZmZ eedddZejddd	Z	G d
d dZ
dS )    N)Template)ListAny)env_namereturnc                 C   s.   t j| d}|dkr*d|  d}t||S )z
    Tries to retrieve environment variable. Raises ``ValueError``
    if no environment variable found.

    Args:
        env_name (str): Name of the env variable
    NzEnvironment variable z expected, but not set)osenvironget
ValueError)r   valuemsg r   G/tmp/pip-unpacked-wheel-ua33x9lu/torch/distributed/elastic/utils/api.pyget_env_variable_or_raise   s
    r   )r   c                  C   s   t jdd t jt jd} | D ]j}|\}}}}}t  |||}z|d |d |W   S  tk
r } z|  W 5 d }~X Y qX qtdd S )N	localhost)hostportfamilytype)r   r   r   zFailed to create a socket)	socketgetaddrinfo	AF_UNSPECSOCK_STREAMbindlistenOSErrorcloseRuntimeError)addrsaddrr   r   proto_ser   r   r   get_socket_with_port   s        


r$   c                   @   s2   e Zd ZdZdZeee eee dddZ	dS )macroszS
    Defines simple macros for caffe2.distributed.launch cmd args substitution
    z${local_rank})args
local_rankr   c                 C   sB   g }| D ]4}t |tr2t|j|d}|| q|| q|S )N)r'   )
isinstancestrr   safe_substituteappend)r&   r'   Zargs_subargsubr   r   r   
substitute5   s    
zmacros.substituteN)
__name__
__module____qualname____doc__r'   staticmethodr   r   r)   r.   r   r   r   r   r%   .   s   r%   )r   r   stringr   typingr   r   r)   r   r$   r%   r   r   r   r   <module>	   s   