Hi, ScottZ. I I have to write such a thing, I'll wrap the whole thing into some class, say Pinger. It will have "do" method, which will perform one particular pinging action. It'll also have a start/stop mechanism, which will start a thread to continuously pinging a host. To notify environment (say, yours tray icon) about host state change (dead/ alive), it will have callback mechanism (register_callback/ unregister_callback). Here, I've written a simple implementation, maybe this will be helpful.
====== pinger.py ================ import os import threading import subprocess import re import time class Pinger: def __init__(self, ip = None): self.ip = None self.running = False self.callbacks = list() self.setAddress(ip) def setAddress(self, ip): if self.ip != ip: if self.running: self.stop() self.ip = ip def do(self): if os.name == "nt": # Windows pcmd = "ping -n 1 -w 1000 " else: # *nix pcmd = "ping -c1 -W1 " p = subprocess.Popen(pcmd + self.ip, shell=True, stdout=subprocess.PIPE) # give it time to respond p.wait() a = re.search('(.*)ms', p.stdout.read()) if a: return True else: return False def start(self): def run(): result = False while self.running: next = self.do() if next != result and self.running: [ callback(next) for callback in self.callbacks ] result = next self.ping_thread = threading.Thread(target = run) self.running = True self.ping_thread.start() def stop(self): self.running = False def register_callback(self, callback): if callback not in self.callbacks: self.callbacks.append(callback) def unregister_callback(self, callback): if callback in self.callbacks: self.callbacks.remove(callback) if __name__ == '__main__': p = Pinger('192.168.1.1') def printout(alive): if alive: print 'Host is alive.' else: print 'Host is dead.' p.register_callback(printout) p.start() while True: print "Ding..." time.sleep(1) ================ Note that printout will be called ONLY if host state has changed, not on EVERY ping. -- Best Regards, Andrey Balaguta -- http://mail.python.org/mailman/listinfo/python-list