Chris Hallman wrote:
> 
> I made a mistake in my first email..... I meant that I can't get fc to 
> write to the file. Here is the error:
> 
> Traceback (most recent call last):
>   File "thread_test_ping.py", line 37, in ?
>     output.write(fc + " failures found.\n")
> TypeError: unsupported operand type(s) for +: 'int' and 'str'

This is a pretty easy error to understand. It is saying that you can't add an 
int and a string. Looking at your code, you are trying to add fc + " failures 
found.\n". fc is indeed an int. You have to change it to a string to be able to 
add it to another string. You can do this with the str() function. So the 
correct statement is
  output.write(str(fc) + " failures found.\n")

> 
> I tried the suggestions you made, but I can't get it to work. Is this 
> what you meant?:

No, not quite.
> 
> #!/usr/bin/env python
> 
> #Let us profile code which uses threads
> import os, re, string, thread, threading, time
> from time import strftime
> #from threading import Thread
> 
> class PingThread(threading.Thread):
>     def __init__(self, rtr):
>         threading.Thread.__init__(self)
>         self.rtr = rtr

The init method initializes a PingThread. It is passed self as an argument, 
plus whatever parameters you pass in when you create the PingThread. You call 
the superclass constructor and save the value of the parameter. So far so 
good...but this next line is creating a PingThread, it belongs below in your 
loop.

>         PingThread(rtr).start(rtr)
>    
>     def run(self):

Here you should reference self.rtr so you get the value that was stored in the 
call to __init__(), and similarly for each reference to rtr in the run method.

>         pingaf = os.popen('ping -n 1 -w 3 ' + rtr)
>         pingas = string.join(pingaf.readlines())
>         if ms.search(pingas):
>             print (re.sub('\n','',rtr)) + " responded."    #for debugging
>         else:
>             pingaf = os.popen('ping -n 2 -w 3 ' + rtr)
>             pingas = string.join(pingaf.readlines())
>             if ms.search(pingas):
>                 print (re.sub('\n','',rtr)) + " responded."    # for 
> debugging
>             else:
>                 fc=fc+1
>                 output.write(re.sub('\n','',rtr) + " did not respond.\n")
> 
> fc = 0    # failure counter
> ms = re.compile("Reply from")
> rpath = (r"c:\temp\py\network_ping_routers.txt")
> if os.path.exists(r"c:\temp\py\network_ping_again.txt"):
>     rpath = (r"c:\temp\py\network_ping_again.txt")
> wpath = (r"c:\temp\py\network_ping.out")
> #os.system(r"c:\tnd\bin\cawto.exe -cat NetNet -n l17aesm1 forward blue 
> held Weekly ISDN testing has started -" + strftime(" %H:%M:%S %x") + "\n")
> output = open(wpath, "a")
> output.write("\n" + "\n" + "Network PING test started -" + strftime(" 
> %H:%M:%S %x") + "\n")
> output.flush()
> threads = []
> for rtr in file(rpath):
>     thread = PingThread()
Here is where you need to call PingThread(rtr) to pass the value of rtr to the 
constructor.

>     thread.start()
>     threads.append(thread)
> for thread in threads:
>     thread.join()
> print fc    # for debugging
> output.write(fc + " failures found.\n")
> output.write("\n" + "\n" + "Network PING test completed -" + strftime(" 
> %H:%M:%S %x") + "\n")
> output.close()

I suspect that I am talking over your head and that maybe you are in over your 
head a bit here. If you don't understand the basics of classes and parameter 
passing you should spend some time with a tutorial that explains them, for 
example Alan Gauld's tutorial at
http://www.freenetpages.co.uk/hp/alan.gauld/

There is a brief introduction to threading here. It even uses your problem 
(pinging multiple servers) as the example.
http://www.wellho.net/solutions/python-python-threads-a-first-example.html

Kent
http://www.kentsjohnson.com

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to