At 11:13 AM 12/14/2005, Carroll, Barry wrote: >Greetings: > >I am implementing a (crude but useful) debug facility in my test >system client software. Basically, I test the value of a global >Boolean. It True, I write pertinent data to a text file. I want to >do this in multiple functions in a module. Rather than open and >close the file each time I write, I want to open the file once at >the start of process and close it at the end. Here are excerpts >from the module. > >########################## >import socket >import struct >import time > ># initialize the debug flag >DEBUG = True >. . . > >dbgf = None # File object and path for saving debug output >dbgfname = "debug.txt" > >def snd_cmd(sock,cmd): > > . . . > > while remainlen > 0: > if remainlen > MTU: > pktstp = pktstrt + MTU > else: > pktstp = pktlen > pktflags |= EOD > > pkthdr = struct.pack('@2BH',pktflags,seq,pktlen) > sndpkt = pkthdr+cmd[pktstrt:pktstp] > > if DEBUG: > dbgf.write("command: " + cmd + "\n") > dbgf.write("flags: 0x%X, seq: %u, len: %u\n" % > (pktflags, seq, pktlen)) > > sock.sendto(sndpkt,addr) > > pktstrt += MTU > remainlen -= MTU > pktflags = pktflags & ~SOD > seq = (seq + 1) % 256 > > . . . > >def recv_resp(sock): > response = '' > try: > response = sock.recv(MTU) > except socket.timeout: > errtupl = ("ERROR", 'Server did not respond') > return (errtupl, response) > > . . . > > if DEBUG: > dbgf.write("response: " + response + "\n") > dbgf.write("flags: 0x%X, seq: %u, len: %u\n" % (flags, retseq, dlen)) > > . . . > > return (errtupl, response) > >def do_cmd(cmd): > > sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) > sock.settimeout(timetowait) > retriesleft = retries > if DEBUG: > dbgf = open(dbgfname,mode="a")
dbgf is a local variable. If you want to reassign to the global you must add global dbgf to the function > dbgf.write("\n"+str(time.localtime())+"\n") > > while retriesleft > 0: > snd_cmd(sock, cmd) > recvtupl = recv_resp(sock) > if recvtupl[0][0] != "ERROR": > break > retriesleft -= 1 > > if DEBUG: > dbgf.close() > > sock.close( ) > return recvtupl >########################## > >When I run this code, I get the following error message: > ><<<<<<<<<<<<<<<<<<<<<<< >A problem occurred in a Python script. Here is the sequence of >function calls leading up to the error, in the order they occurred. >/var/www/cgi-bin/pagen.py > 76 # function. Check the returned error code for success. > 77 cmdtosnd = state['s']['getcmd'] > *****78 (errorcode, errorstr), > platformstate['itype']['curstate'] = do_cmd(cmdtosnd) > 79 if errorcode == 0: > 80 cmdtosnd = state['t']['getcmd'] > > . . . > >/var/www/cgi-bin/Client.py in do_cmd(cmd='cmd') > 160 > 161 while retriesleft > 0: > *****162 snd_cmd(sock, cmd) > 163 recvtupl = recv_resp(sock) > 164 if recvtupl[0][0] != IIPSRVERROR: > >global snd_cmd = <function snd_cmd>, sock = <socket._socketobject >object>, cmd = 'cmd' > > > /var/www/cgi-bin/Client.py in snd_cmd(sock=<socket._socketobject > object>, cmd='cmd') > 65 > 66 if DEBUG: > *****67 dbgf.write("command: " + cmd + "\n") > 69 > >global dbgf = None, dbgf.write undefined, cmd = 'cmd' > > >AttributeError: 'NoneType' object has no attribute 'write' > args = ("'NoneType' object has no attribute 'write'",) > >>>>>>>>>>>>>>>>>>>>>>> > >dbgf is declared at the top of the module. It is opened and closed >in do_cmd. I attempt to write to it in snd_cmd and recv_resp, both >of which are called by do_cmd. Since dbgf is global to all of these >functions, I expected its value (the open file object) to >persist. I don't understand why it didn't. I expect I have >misunderstood Python's scoping rules. Can someone enlighten me? > >Thanks and enjoy the holidays. > >BGC >________________________ >"Never trust anything that can think for itself >if you can't see where it keeps its brain" >JK Rowling > > > >_______________________________________________ >Tutor maillist - Tutor@python.org >http://mail.python.org/mailman/listinfo/tutor _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor