[Tutor] Scope Problem with Files

Carroll, Barry Barry.Carroll at psc.com
Wed Dec 14 20:13:05 CET 2005


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.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
 




More information about the Tutor mailing list