forked from colonelpanic/dotfiles
run_command_at_interval
This commit is contained in:
parent
44c26651b6
commit
3660ae722a
56
dotfiles/lib/python/run_command_at_interval.py
Normal file
56
dotfiles/lib/python/run_command_at_interval.py
Normal file
@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env python
|
||||
from optparse import OptionParser
|
||||
from subprocess import Popen, PIPE
|
||||
import select
|
||||
import sys
|
||||
import time
|
||||
|
||||
|
||||
class IntervallicCommandRunner(object):
|
||||
|
||||
def __init__(self, command, command_interval, sleep_time=1):
|
||||
self.command = command
|
||||
self.command_interval = command_interval
|
||||
self.sleep_time = sleep_time
|
||||
self.last_time = None
|
||||
self.read_last_time = True
|
||||
|
||||
@property
|
||||
def can_read_from_stdin(self):
|
||||
return sys.stdin in select.select([sys.stdin], [], [], 0)[0]
|
||||
|
||||
def _accumulate_input(self):
|
||||
time_to_stop_after = self.last_time + self.command_interval
|
||||
lines = []
|
||||
new_time = time.time()
|
||||
|
||||
while new_time < time_to_stop_after:
|
||||
for _ in range(10):
|
||||
if self.can_read_from_stdin:
|
||||
lines.append(sys.stdin.readline())
|
||||
break
|
||||
else:
|
||||
time.sleep(self.sleep_time)
|
||||
new_time = time.time()
|
||||
|
||||
self.last_time = new_time
|
||||
|
||||
return ''.join(lines)
|
||||
|
||||
def loop_indefinitely(self):
|
||||
self.last_time = time.time()
|
||||
while True:
|
||||
Popen([self.command], shell=True, stdin=PIPE).communicate(
|
||||
self._accumulate_input()
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = OptionParser()
|
||||
parser.add_option('-i', '--command-interval', dest="command_interval",
|
||||
action="store", type="float", default=1.0)
|
||||
parser.add_option('-c', '--command', dest="command", action="store",
|
||||
default='cat')
|
||||
options, _ = parser.parse_args()
|
||||
IntervallicCommandRunner(options.command,
|
||||
options.command_interval).loop_indefinitely()
|
Loading…
Reference in New Issue
Block a user