[Tutor] close failed in file object destructor:
Dave Angel
d at davea.name
Tue Oct 18 21:06:09 CEST 2011
On 10/18/2011 01:59 PM, Navneet wrote:
> Hi,
>
> I am trying to search a list for prime numbers but it's throwing me an
> error at line no.25.
> I am not able to figure what exactly is the prob
> ne help ??? Error is this:
> $ python "prime1 - Copy.py"
> Unhandled exception in thread started by
> Traceback (most recent call last):
> File "prime1 - Copy.py", line 25, in findPrime
> close failed in file object destructor:
> Error in sys.excepthook:
>
> program is below: Numberlist is number range from 1..1000
>
>
> import sys
> import threading
> import thread
> import time
>
> class FindPno():
>
> c = []
> f = open("A;\Numberlist.txt")
> for i in f:
> c.append(i)
> f.close()
> ##print len(c)
> ##Thread should start here
> def __init__(self):
> thread.start_new_thread(self.findPrime,(1,))
>
> def findPrime(self,tid):
> global tlock
> ## print "I am here"
> tlock = thread.allocate_lock()
> ## print "I am here"
> tlock.acquire()
> ## print "I am here"
> for i1 in range(len(c)): ##this is the 25th line
> for i2 in range(2,int(c[i1])):
>
> if int(c[i1]) == 1:
> print "I am here"
> tlock.release()
> break
> if int(c[i1]) == 2:
> print c
> print "I am here"
> tlock.release()
> break
> rem = int(c[i1])%i2
> if rem == 0:
> print "I am here"
> tlock.release()
> break
> if i2 == int(c[i1])-1:
> print int(c[i1]), "This is the Thread",tid
> print "I am here"
> tlock.release()
>
> tlock.release()
>
> if __name__ == '__main__':
> a = FindPno()
>
I have no idea what you're trying to accomplish here. The code is far
too complex to solve the problem you've described, and very inefficient
besides. And threads won't help speed up a CPU-bound Python program of
this type.
I also have no idea how you got the traceback you showed. After I
cleaned up a lot of other stuff, I get the error:
Traceback (most recent call last):
File "prim.py", line 52, in <module>
a = FindPno()
File "prim.py", line 19, in __init__
self.findPrime(0)
File "prim.py", line 28, in findPrime
for i2 in range(2,int(c[i1])):
NameError: global name 'c' is not defined
And the problem with that is that the class attribute 'c' would need a
prefix to address it in a method. Simplest would be to say
self.c
each place you have c. or else just declare global c inside the class
scope.
Is this program transliterated from some other language? Or were there
some strange constraints in the original assignment?
After cleanup, the program does work, but I had to get rid of the thread
stuff to make it work here. As written, the program terminates before
the extra thread does any work.
--
DaveA
More information about the Tutor
mailing list