# Buggy code
def get_last_output(self, cmds=None):
    """Get output for last commands executed by ``run_command``

    :param cmds: Commands to get output for. Defaults to ``client.cmds``
    :type cmds: list(:py:class:`gevent.Greenlet`)

    :rtype: dict
    """
    cmds = self.cmds if cmds is None else cmds
    if cmds is None:
        return
    output = {}
    for cmd in self.cmds:
        self.get_output(cmd, output)
    return output


# Traceback (ValueError)
Traceback (most recent call last):
File "./aws-instances", line 172, in <module>
main()
File "./aws-instances", line 73, in main
facts = remote_facts(ips)
File "./aws-instances", line 146, in remote_facts
out_kern = client.run_command('uname -r')
File "/home/user/do-aws-ec2-facts/aws/lib64/python3.6/site-packages/pssh/clients/native/parallel.py", line 223, in run_command
greenlet_timeout=greenlet_timeout)
File "/home/user/do-aws-ec2-facts/aws/lib64/python3.6/site-packages/pssh/clients/base_pssh.py", line 96, in run_command
self.get_output(cmd, output, timeout=greenlet_timeout)
File "/home/user/do-aws-ec2-facts/aws/lib64/python3.6/site-packages/pssh/clients/base_pssh.py", line 141, in get_output
(channel, host, stdout, stderr, stdin) = cmd.get(timeout=timeout)
File "src/gevent/greenlet.py", line 709, in gevent._greenlet.Greenlet.get
File "src/gevent/greenlet.py", line 317, in gevent._greenlet.Greenlet._raise_exception
File "/home/user/do-aws-ec2-facts/aws/lib64/python3.6/site-packages/gevent/_compat.py", line 47, in reraise
raise value.with_traceback(tb)
File "src/gevent/greenlet.py", line 766, in gevent._greenlet.Greenlet.run
File "/home/user/do-aws-ec2-facts/aws/lib64/python3.6/site-packages/pssh/clients/native/parallel.py", line 237, in _run_command
raise ex
File "/home/user/do-aws-ec2-facts/aws/lib64/python3.6/site-packages/pssh/clients/native/parallel.py", line 233, in _run_command
use_pty=use_pty, encoding=encoding, timeout=timeout)
File "/home/user/do-aws-ec2-facts/aws/lib64/python3.6/site-packages/pssh/clients/native/single.py", line 442, in run_command
channel = self.execute(_command, use_pty=use_pty)
File "/home/user/do-aws-ec2-facts/aws/lib64/python3.6/site-packages/pssh/clients/native/single.py", line 324, in execute
channel = self.open_session() if channel is None else channel
File "/home/user/do-aws-ec2-facts/aws/lib64/python3.6/site-packages/pssh/clients/native/single.py", line 297, in open_session
wait_select(self.session)
File "pssh/native/_ssh2.pyx", line 171, in pssh.native._ssh2.wait_select
File "/home/user/do-aws-ec2-facts/aws/lib64/python3.6/site-packages/gevent/select.py", line 145, in select
sel_results = _original_select(rlist, wlist, xlist, 0)
ValueError: filedescriptor out of range in select()

# Fixed code
def get_last_output(self, cmds=None, greenlet_timeout=None, return_list=False):
    """Get output for last commands executed by ``run_command``

    :param cmds: Commands to get output for. Defaults to ``client.cmds``
    :type cmds: list(:py:class:`gevent.Greenlet`)
    :param greenlet_timeout: (Optional) Greenlet timeout setting.
      Defaults to no timeout. If set, this function will raise
      :py:class:`gevent.Timeout` after ``greenlet_timeout`` seconds
      if no result is available from greenlets.
      In some cases, such as when using proxy hosts, connection timeout
      is controlled by proxy server and getting result from greenlets may
      hang indefinitely if remote server is unavailable. Use this setting
      to avoid blocking in such circumstances.
      Note that ``gevent.Timeout`` is a special class that inherits from
      ``BaseException`` and thus **can not be caught** by
      ``stop_on_errors=False``.
    :type greenlet_timeout: float
    :param return_list: (Optional) Return a list of ``HostOutput`` objects
      instead of dictionary. ``run_command`` will return a list starting
      from 2.0.0 - enable this flag to avoid client code breaking on
      upgrading to 2.0.0.
    :type return_list: bool

    :rtype: dict or list
    """
    cmds = self.cmds if cmds is None else cmds
    if cmds is None:
        return
    if not return_list:
        warn(_output_depr_notice)
        output = {}
        for cmd in self.cmds:
            self.get_output(cmd, output, timeout=greenlet_timeout)
        return output
    return [
        self._get_output_from_greenlet(cmd, timeout=greenlet_timeout) for cmd in cmds
    ]