Skip to content

Instantly share code, notes, and snippets.

@rurumimic
Last active October 25, 2022 06:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rurumimic/3bb00a977f876f6ced97b700867636ea to your computer and use it in GitHub Desktop.
Save rurumimic/3bb00a977f876f6ced97b700867636ea to your computer and use it in GitHub Desktop.
realtime subprocess output in python 2 & 3
import logging
import subprocess
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
def main(cmd):
try:
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
while True:
out = proc.stdout.readline()
if out == '' and proc.poll() != None:
break
if out != '':
logger.debug(out.rstrip("\n"))
except subprocess.CalledProcessError as e:
logger.error(e.output)
raise e
except Exception as e:
raise e
if __name__ == "__main__":
main('echo "wait 1 sec" && sleep 1 && echo "ok, great."', ".")
@rurumimic
Copy link
Author

rurumimic commented Oct 25, 2022

in python 3.x:

import logging
import signal
import subprocess

TIMEOUT = 600

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())

def main(cmd, chdir):

    def alarm_handler(signum, frame):
        raise subprocess.TimeoutExpired(cmd, TIMEOUT)

    signal.signal(signal.SIGALRM, alarm_handler)
    signal.alarm(TIMEOUT)

    try:
        with subprocess.Popen(
            cmd,
            cwd=chdir,
            shell=True,
            encoding="utf-8",
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            bufsize=1,
        ) as proc:
            for line in iter(proc.stdout.readline, ""):  # readline = blocking
                logger.debug(line.rstrip("\n"))
        if proc.returncode != 0:
            raise subprocess.CalledProcessError(
                proc.returncode, cmd, "Process is not Complete."
            )
    except subprocess.TimeoutExpired as e:
        logger.error(e.output)
        raise e
    except subprocess.CalledProcessError as e:
        logger.error(e.output)
        raise e
    except Exception as e:
        raise e

if __name__ == "__main__":
    main('echo "wait 1 sec" && sleep 1 && echo "ok, great."', ".")

@rurumimic
Copy link
Author

rurumimic commented Oct 25, 2022

in python 3.x:

try:
    stdout = subprocess.check_output(
        cmd,
        cwd=chdir,
        timeout=TIMEOUT,
        shell=True,
        encoding="utf-8",
        stderr=subprocess.STDOUT,
    )
    logger.debug(stdout)
except subprocess.TimeoutExpired as e:
    logger.error(e.output)
    raise e
except subprocess.CalledProcessError as e:
    logger.error(e.output)
    raise e
except Exception as e:
    raise e

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment