Mercurial > hg > periprocess
annotate periprocess/process.py @ 0:d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Wed, 30 Nov 2016 12:40:25 -0800 |
parents | |
children |
rev | line source |
---|---|
0
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
1 #!/usr/bin/env python |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
2 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
3 """ |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
4 multiprocessing/subprocess front-end |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
5 """ |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
6 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
7 # imports |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
8 import argparse |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
9 import atexit |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
10 import os |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
11 import signal |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
12 import subprocess # http://bugs.python.org/issue1731717 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
13 import sys |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
14 import time |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
15 import tempfile |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
16 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
17 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
18 # globals |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
19 __all__ = ['Process'] |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
20 string = (str, unicode) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
21 PIDS = set() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
22 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
23 # ensure subprocesses gets killed on exit |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
24 def killall(): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
25 """kill all subprocess PIDs""" |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
26 global PIDS |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
27 for pid in PIDS.copy(): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
28 try: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
29 os.kill(pid, 9) # SIGKILL |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
30 PIDS.discard(pid) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
31 except: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
32 sys.stderr.write("Unable to kill PID {}\n".format(pid)) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
33 atexit.register(killall) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
34 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
35 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
36 signals = (signal.SIGHUP, signal.SIGINT, signal.SIGQUIT, signal.SIGSEGV, signal.SIGTERM) # signals to handle |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
37 fatal = set([signal.SIGINT, signal.SIGSEGV, signal.SIGKILL, signal.SIGTERM]) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
38 # ensure subprocesses get killed on signals |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
39 def sighandler(signum, frame): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
40 """https://docs.python.org/2/library/signal.html""" |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
41 sys.stderr.write('Signal handler called with signal {}\n; terminating subprocesses: {}'.format(signum, |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
42 ', '.join([str(pid) for pid in sorted(PIDS)]))) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
43 killall() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
44 if signum in fatal: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
45 print ("Caught signal {}; exiting".format(signum)) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
46 sys.exit() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
47 for signum in signals: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
48 try: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
49 signal.signal(signum, sighandler) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
50 except RuntimeError as e: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
51 print ('[{}] {}'.format(signum, e)) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
52 raise |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
53 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
54 class Process(subprocess.Popen): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
55 """why would you name a subprocess object Popen?""" |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
56 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
57 # http://docs.python.org/2/library/subprocess.html#popen-constructor |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
58 defaults = {'bufsize': 1, # line buffered |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
59 'store_output': True, # store stdout |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
60 } |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
61 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
62 def __init__(self, command, **kwargs): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
63 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
64 # get verbosity |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
65 self.verbose = kwargs.pop('verbose', False) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
66 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
67 # setup arguments |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
68 self.command = command |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
69 _kwargs = self.defaults.copy() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
70 _kwargs.update(kwargs) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
71 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
72 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
73 # on unix, ``shell={True|False}`` should always come from the |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
74 # type of command (string or list) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
75 if not subprocess.mswindows: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
76 _kwargs['shell'] = isinstance(command, string) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
77 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
78 # output buffer |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
79 self.location = 0 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
80 self.output_buffer = tempfile.SpooledTemporaryFile() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
81 self.output = '' if _kwargs.pop('store_output') else None |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
82 _kwargs['stdout'] = self.output_buffer |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
83 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
84 # ensure child in process group |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
85 # see : |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
86 # - http://pymotw.com/2/subprocess/#process-groups-sessions |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
87 # - http://ptspts.blogspot.com/2012/11/how-to-start-and-kill-unix-process-tree.html |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
88 _kwargs['preexec_fn'] = os.setpgrp |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
89 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
90 # runtime |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
91 self.start = time.time() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
92 self.end = None |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
93 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
94 if self.verbose: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
95 # print useful info |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
96 print ("Running `{}`; started: {}".format(str(self), self.start)) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
97 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
98 # launch subprocess |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
99 try: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
100 subprocess.Popen.__init__(self, command, **_kwargs) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
101 PIDS.add(self.pid) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
102 if self.verbose: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
103 # print the PID |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
104 print ("PID: {}".format(self.pid)) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
105 except: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
106 # print the command |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
107 print ("Failure to run:") |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
108 print (self.command) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
109 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
110 # reraise the hard way: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
111 # http://www.ianbicking.org/blog/2007/09/re-raising-exceptions.html |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
112 exc = sys.exc_info() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
113 raise exc[0], exc[1], exc[2] |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
114 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
115 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
116 def _finalize(self, process_output): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
117 """internal function to finalize""" |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
118 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
119 # read final output |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
120 if process_output is not None: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
121 self.read(process_output) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
122 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
123 # reset output buffer location |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
124 self.output_buffer.seek(0) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
125 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
126 # set end time |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
127 self.end = time.time() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
128 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
129 # remove PID from list |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
130 PIDS.discard(self.pid) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
131 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
132 def poll(self, process_output=None): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
133 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
134 if process_output is not None: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
135 self.read(process_output) # read from output buffer |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
136 poll = subprocess.Popen.poll(self) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
137 if poll is not None: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
138 self._finalize(process_output) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
139 return poll |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
140 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
141 def wait(self, maxtime=None, sleep=1., process_output=None): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
142 """ |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
143 maxtime -- timeout in seconds |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
144 sleep -- number of seconds to sleep between polling |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
145 """ |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
146 while self.poll(process_output) is None: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
147 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
148 # check for timeout |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
149 curr_time = time.time() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
150 run_time = self.runtime() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
151 if maxtime is not None and run_time > maxtime: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
152 self.kill() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
153 self._finalize(process_output) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
154 return |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
155 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
156 # naptime |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
157 if sleep: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
158 time.sleep(sleep) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
159 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
160 # finalize |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
161 self._finalize(process_output) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
162 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
163 return self.returncode # set by ``.poll()`` |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
164 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
165 def read(self, process_output=None): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
166 """read from the output buffer""" |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
167 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
168 self.output_buffer.seek(self.location) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
169 read = self.output_buffer.read() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
170 if self.output is not None: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
171 self.output += read |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
172 if process_output: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
173 process_output(read) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
174 self.location += len(read) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
175 return read |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
176 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
177 def commandline(self): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
178 """returns string of command line""" |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
179 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
180 if isinstance(self.command, string): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
181 return self.command |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
182 return subprocess.list2cmdline(self.command) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
183 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
184 __str__ = commandline |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
185 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
186 def runtime(self): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
187 """returns time spent running or total runtime if completed""" |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
188 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
189 if self.end is None: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
190 return time.time() - self.start |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
191 return self.end - self.start |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
192 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
193 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
194 def main(args=sys.argv[1:]): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
195 """CLI""" |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
196 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
197 description = """demonstration of how to do things with subprocess""" |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
198 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
199 # available programs |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
200 progs = {'yes': ["yes"], |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
201 'ping': ['ping', 'google.com']} |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
202 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
203 # parse command line |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
204 parser = argparse.ArgumentParser(description=description) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
205 parser.add_argument("-t", "--time", dest="time", |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
206 type=float, default=4., |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
207 help="seconds to run for (or <= 0 for forever)") |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
208 parser.add_argument("-s", "--sleep", dest="sleep", |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
209 type=float, default=1., |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
210 help="sleep this number of seconds between polling") |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
211 parser.add_argument("-p", "--prog", dest='program', |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
212 choices=progs.keys(), default='ping', |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
213 help="subprocess to run") |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
214 parser.add_argument("--list-programs", dest='list_programs', |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
215 action='store_true', default=False, |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
216 help="list available programs") |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
217 parser.add_argument("--wait", dest='wait', |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
218 action='store_true', default=False, |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
219 help="run with ``.wait()`` and a callback") |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
220 parser.add_argument("--callback", dest='callback', |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
221 action='store_true', default=False, |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
222 help="run with polling and a callback") |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
223 options = parser.parse_args(args) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
224 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
225 # list programs |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
226 if options.list_programs: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
227 for key in sorted(progs.keys()): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
228 print ('{}: {}'.format(key, subprocess.list2cmdline(progs[key]))) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
229 sys.exit(0) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
230 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
231 # select program |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
232 prog = progs[options.program] |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
233 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
234 # start process |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
235 proc = Process(prog) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
236 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
237 # demo function for processing output |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
238 def output_processor(output): |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
239 print ('[{}]:\n{}\n{}'.format(proc.runtime(), |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
240 output.upper(), |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
241 '-==-'*10)) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
242 if options.callback: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
243 process_output = output_processor |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
244 else: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
245 process_output = None |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
246 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
247 if options.wait: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
248 # wait for being done |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
249 proc.wait(maxtime=options.time, sleep=options.sleep, process_output=output_processor) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
250 else: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
251 # start the main subprocess loop |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
252 while proc.poll(process_output) is None: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
253 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
254 if options.time > 0 and proc.runtime() > options.time: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
255 proc.kill() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
256 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
257 if options.sleep: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
258 time.sleep(options.sleep) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
259 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
260 if process_output is None: |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
261 # process the output with ``.read()`` call |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
262 read = proc.read() |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
263 output_processor(read) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
264 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
265 # correctness tests |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
266 assert proc.end is not None |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
267 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
268 # print summary |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
269 output = proc.output |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
270 n_lines = len(output.splitlines()) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
271 print ("{}: {} lines, ran for {} seconds".format(subprocess.list2cmdline(prog), n_lines, proc.runtime())) |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
272 |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
273 if __name__ == '__main__': |
d28351df9a8a
initial commit from http://k0s.org/hg/config/file/tip/python/example/process.py
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
274 main() |