<gh_stars>1-10
import argparse
import subprocess
import sys
import time

class NoMoreRetries(Exception):
    pass

def normalize_limit(limit):
    if limit is not None:
        limit = int(limit)
        if limit < 1:
            raise ValueError('Limit must be >= 1, or None.')
    return limit

def normalize_sleepy(sleepy):
    if sleepy is not None:
        sleepy = float(sleepy)
        if sleepy <= 0:
            raise ValueError('Sleep must be > 0, or None.')
    return sleepy

def retry(command, limit, sleepy):
    limit = normalize_limit(limit)
    sleepy = normalize_sleepy(sleepy)
    status = 1
    while limit is None or limit > 0:
        status = subprocess.run(command, shell=True).returncode
        if status == 0:
            return
        print(f'{command} failed with status {status}.')
        if limit is not None:
            limit -= 1
        if sleepy is not None:
            time.sleep(sleepy)
    raise NoMoreRetries()

def retry_argparse(args):
    return retry(
        command=args.command,
        limit=args.limit,
        sleepy=args.sleep,
    )

def main(argv):
    parser = argparse.ArgumentParser(description=__doc__)

    parser.add_argument('command', nargs='+')
    parser.add_argument('--limit', type=int, default=None)
    parser.add_argument('--sleep', type=float, default=None)
    parser.set_defaults(func=retry_argparse)

    args = parser.parse_args(argv)
    return args.func(args)

if __name__ == '__main__':
    raise SystemExit(main(sys.argv[1:]))
