comparison python/multiproc.py @ 606:5b561c7b2005

STUB: python/multiproc.py
author Jeff Hammel <k0scist@gmail.com>
date Sun, 02 Feb 2014 11:07:04 -0800
parents bd30deecdf4a
children 567492ef7b57
comparison
equal deleted inserted replaced
605:ab9145ded910 606:5b561c7b2005
9 import subprocess 9 import subprocess
10 import sys 10 import sys
11 import time 11 import time
12 import tempfile 12 import tempfile
13 13
14 string = (str, unicode)
15
14 class Process(subprocess.Popen): 16 class Process(subprocess.Popen):
15 """why would you name a subprocess object Popen?""" 17 """why would you name a subprocess object Popen?"""
16 18
17 defaults = {'buffsize': 'line buffered' 19 # http://docs.python.org/2/library/subprocess.html#popen-constructor
20 defaults = {'buffsize': 1, # line buffered
18 } 21 }
19 22
20 def __init__(self, *args, **kwargs): 23 def __init__(self, command, **kwargs):
21 self.output = tempfile.SpooledTemporaryFile() 24
22 subprocess.Popen.__init__(self, *args, **kwargs) 25 # setup arguments
23 # TODO: finish 26 self.command = command
27 _kwargs = self.defaults.copy()
28 _kwargs.update(kwargs)
29
30 # output buffer
31 self.output_buffer = tempfile.SpooledTemporaryFile()
32 self.location = 0
33 self.output = []
34 _kwargs['stdout'] = self.output_buffer
35
36 # launch subprocess
37 self.start = time.time()
38 subprocess.Popen.__init__(self, *args, **_kwargs)
39
40 def wait(self, maxtime=None, sleep=1.):
41 """
42 maxtime -- timeout in seconds
43 sleep -- number of seconds to sleep between polling
44 """
45 while self.poll() is None:
46
47 # check for timeout
48 curr_time = time.time()
49 run_time = curr_time - self.start
50 if run_time > maxtime:
51 # TODO: read from output
52 return process.kill()
53
54 # naptime
55 if sleep:
56 time.sleep(sleep)
57
58 # read from output buffer
59 self.output_buffer.seek(self.location)
60 read = self.output_buffer.read()
61 self.location += len(read)
62
63 def commandline(self):
64 """returns string of command line"""
65
66 if isinstance(self.command, string):
67 return self.command
68 return subprocess.list2cmdline(self.command)
69
70 __str__ = commandline
71
24 72
25 def main(args=sys.argv[1:]): 73 def main(args=sys.argv[1:]):
26 """CLI""" 74 """CLI"""
27 75
28 # available programs 76 # available programs
38 help="seconds to run for") 86 help="seconds to run for")
39 parser.add_argument("-s", "--sleep", dest="sleep", 87 parser.add_argument("-s", "--sleep", dest="sleep",
40 type=float, default=1., 88 type=float, default=1.,
41 help="sleep this number of seconds between polling") 89 help="sleep this number of seconds between polling")
42 parser.add_argument("-p", "--prog", dest='program', 90 parser.add_argument("-p", "--prog", dest='program',
43 choices=progs.keys(), 91 choices=progs.keys(), default='ping',
44 help="subprocess to run") 92 help="subprocess to run")
45 # TODO parser.add_argument("--list-programs", help="list available programs") 93 parser.add_argument("--list-programs", dest='list_programs',
94 action='store_true', default=False,
95 help="list available programs")
46 options = parser.parse_args(args) 96 options = parser.parse_args(args)
47 97
48 98
49 # select program 99 # select program
50 prog = progs[options.program] 100 prog = progs[options.program]
58 while proc.poll() is None: 108 while proc.poll() is None:
59 curr_time = time.time() 109 curr_time = time.time()
60 run_time = curr_time - start 110 run_time = curr_time - start
61 if run_time > options.time: 111 if run_time > options.time:
62 proc.kill() 112 proc.kill()
63 if options.sleep:
64 time.sleep(options.sleep)
65 output.seek(location) 113 output.seek(location)
66 read = output.read() 114 read = output.read()
67 location += len(read) 115 location += len(read)
68 print ('[{}] {}\n{}'.format(run_time, read, '-==-'*10)) 116 print ('[{}] {}\n{}'.format(run_time, read, '-==-'*10))
117 if options.sleep:
118 time.sleep(options.sleep)
69 119
70 # reset tempfile 120 # reset tempfile
71 output.seek(0) 121 output.seek(0)
72 122
73 n_lines = len(output.read().splitlines()) 123 n_lines = len(output.read().splitlines())