By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,139 Members | 1,916 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,139 IT Pros & Developers. It's quick & easy.

Ping monitor - monitor ip in the =?UTF-8?Q?background=3F?=

P: n/a

With python 2.6 and wxpython I'm trying to create a system tray icon
application based around an example found here:

The application will simply change the systray icon based on if an ip
address is online or not.

The ping portion looks like this:

if == "nt": # Windows
pcmd = "ping -n 1 -w 1000 "
else: # *nix
pcmd = "ping -c1 -W1 "

def Ping(ipaddress):
# execute the code and pipe the result to a string
p = subprocess.Popen(pcmd + ipaddress, shell=True,
# give it time to respond

a ='(.*)ms',
if a:
return True
return False

I've been able to add the ping check as a manual process (via a right
click menu item) but very confused on what direction to take on making
the ping a permanent loop while the app is running.

I was looking at making the ping routine a thread process but can't
figure out how to feed back the result to the calling app. Global


Nov 2 '08 #1
Share this Question
Share on Google+
1 Reply

P: n/a
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.

====== ================
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()
def setAddress(self, ip):
if self.ip != ip:
if self.running:
self.ip = ip
def do(self):
if == "nt": # Windows
pcmd = "ping -n 1 -w 1000 "
else: # *nix
pcmd = "ping -c1 -W1 "
p = subprocess.Popen(pcmd + self.ip, shell=True,
# give it time to respond
a ='(.*)ms',
if a:
return True
return False
def start(self):
def run():
result = False
while self.running:
next =
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
def stop(self):
self.running = False
def register_callback(self, callback):
if callback not in self.callbacks:
def unregister_callback(self, callback):
if callback in self.callbacks:

if __name__ == '__main__':
p = Pinger('')
def printout(alive):
if alive:
print 'Host is alive.'
print 'Host is dead.'
while True:
print "Ding..."


Note that printout will be called ONLY if host state has changed, not
on EVERY ping.

Best Regards, Andrey Balaguta
Nov 2 '08 #2

This discussion thread is closed

Replies have been disabled for this discussion.