view fail.py @ 4:8dc420754023

minor upgrades to prepare for streamlining
author Jeff Hammel <k0scist@gmail.com>
date Tue, 23 Aug 2016 16:29:13 -0700
parents d1880117acb5
children b407681e6f2c
line wrap: on
line source

#!/usr/bin/env python

"""
run a program until it fails
"""

# imports
import argparse
import subprocess
import sys
import time


def main(args=sys.argv[1:]):
    """CLI"""

    # parse command line
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('command', help="command to run")
    parser.add_argument('--code', dest='codes', default=(0,), nargs='+',
                        help="allowed exit codes [DEFAULT: 0]")
    parser.add_argument('-s', '--sleep', dest='sleep',
                        type=float, default=1.,
                        help="sleep between iterations [DEFAULT: %(default)s]")
    options = parser.parse_args(args)

    try:

        # main loop
        ctr = 0
        start_loop = time.time()
        while True:

            # note program start time
            program_start_time = time.time() if ctr else start_loop

            # run the subcommand
            process = subprocess.Popen(options.command, shell=True)
            stdout, stderr = process.communicate()
            ctr += 1

            # print iteration information
            print ("Iteration {}".format(ctr))

            # test it
            if process.returncode not in options.codes:
                sys.exit(process.returncode)

            # loop control
            time.sleep(options.sleep)


    except KeyboardInterrupt:
        sys.exit(0)

if __name__ == '__main__':
    main()