Source code for watch_do.doers.shell

"""The :class:`.Shell` class provides a method to run shell commands and
capture their output.

As an example, the following code would provide a method of getting the output
from listing a specific files attributes on the command line.

>>> doer = Shell('ls -lh "%f"')

To actually run and retrieve the output of this command, the :meth:`run` method
should be called.

>>> doer.run('myfile.txt')
"""

import subprocess

from . import Doer


[docs]class Shell(Doer): """Interface with a shell to allow running standard shell commands. This doer enables commands to be run in a shell and have the output captured. """
[docs] def run(self, file_name): """Run the command in the shell. The :meth:`_interpolate_file_name` is called on the ``command`` with ``file_name`` as a parameter to ensure this ``file_name`` is interpolated if it's required. Parameters: file_name (str): The ``file_name`` that this doer should run against. Yields: str: A string containing the output (possibly the partial output) of the command, both stdout and stderr. """ command = Doer._interpolate_file_name(self.command, file_name) with subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='UTF-8', bufsize=1, shell=True) as process: for line in process.stdout: yield line process.wait() # If the command returned a non 0 exit code, yield an error message if process.returncode > 0: yield ('Command failed to run, exited with error code {}' .format(process.returncode))