Python NamedTemporaryFile 已删除但未关闭
Python NamedTemporaryFile deleted without closing it
我正在使用 ZOPE 和 Python 2.4,根据 NamedTemporaryFile,我遇到了问题。我读到文件在关闭时被删除,但不知何故我的文件被删除了,即使它没有。
我有一个函数,可以将一些 xml 规范写入具有 Python 的 threading.Thread 的文件。如果线程完成,
文件名被写入会话变量。我有另一个函数应该在线程完成时打开文件。这是一个 JS 函数,每 10 秒检查一次状态是否为真。到目前为止这是有效的,但是当我尝试通过文件名打开文件时,它已经被删除了。
def startWorker(self):
ts = time.time()
self.threadID = ts
sf = tempfile.NamedTemporaryFile("w+b", prefix=self.threadID, suffix=".zip", dir = "/test/tmp/")
zf = zipfile.ZipFile(sf, "w", zipfile.ZIP_DEFLATED)
mythread = self.MyThread(target, self.threadID, zf, sf)
mythread.join()
success = mythread.getSuccess()
if success:
self.setSessionVar('status', 'true')
self.setSessionVar('filename', zf.filename)
class MyThread(threading.Thread):
def __init__(self, target, threadID, *args):
self.__threadID = threadID
self.__target = target
self.__zf = zf
self.__sf = sf
self.__args = args
threading.Thread.__init__(self, name=self.__threadID)
self.start()
def run(self):
try:
self.zfout = self.__target(self.__zf, self.__sf, *self.__args)
self.__success = True
self.stop()
except:
self.stop()
def stop(self):
self.__keepAlive = False
def getsucces(self):
return self.__success
def getFile(self): #JS function that is called every 10 sec
filename = self.getSessionVar('filename', None)
if self.getSessionVar('status', None) = 'true':
open(filename) # file is already deleted here
else:
#do something
任何人都可以告诉我如何告诉 Python 不要删除文件或帮助我了解 Python 如何处理临时文件吗?
我正在使用 python 2.4,因此无法选择 NamedTemporaryFile 中的 delete=false。
您忽略了 zf
和 sf
对象 MyThread.__init__()
; *args
保持不变。
因为您的 运行 线程没有向打开的文件对象添加额外的引用,所以当 startWorker
函数完成时,不再有对对象的引用,它们将被删除,采取磁盘上的文件。
根据 documentation 此文件将被删除 "two" 次;
It will be destroyed as soon as it is closed (including an implicit
close when the object is garbage collected).
我正在使用 ZOPE 和 Python 2.4,根据 NamedTemporaryFile,我遇到了问题。我读到文件在关闭时被删除,但不知何故我的文件被删除了,即使它没有。 我有一个函数,可以将一些 xml 规范写入具有 Python 的 threading.Thread 的文件。如果线程完成, 文件名被写入会话变量。我有另一个函数应该在线程完成时打开文件。这是一个 JS 函数,每 10 秒检查一次状态是否为真。到目前为止这是有效的,但是当我尝试通过文件名打开文件时,它已经被删除了。
def startWorker(self):
ts = time.time()
self.threadID = ts
sf = tempfile.NamedTemporaryFile("w+b", prefix=self.threadID, suffix=".zip", dir = "/test/tmp/")
zf = zipfile.ZipFile(sf, "w", zipfile.ZIP_DEFLATED)
mythread = self.MyThread(target, self.threadID, zf, sf)
mythread.join()
success = mythread.getSuccess()
if success:
self.setSessionVar('status', 'true')
self.setSessionVar('filename', zf.filename)
class MyThread(threading.Thread):
def __init__(self, target, threadID, *args):
self.__threadID = threadID
self.__target = target
self.__zf = zf
self.__sf = sf
self.__args = args
threading.Thread.__init__(self, name=self.__threadID)
self.start()
def run(self):
try:
self.zfout = self.__target(self.__zf, self.__sf, *self.__args)
self.__success = True
self.stop()
except:
self.stop()
def stop(self):
self.__keepAlive = False
def getsucces(self):
return self.__success
def getFile(self): #JS function that is called every 10 sec
filename = self.getSessionVar('filename', None)
if self.getSessionVar('status', None) = 'true':
open(filename) # file is already deleted here
else:
#do something
任何人都可以告诉我如何告诉 Python 不要删除文件或帮助我了解 Python 如何处理临时文件吗? 我正在使用 python 2.4,因此无法选择 NamedTemporaryFile 中的 delete=false。
您忽略了 zf
和 sf
对象 MyThread.__init__()
; *args
保持不变。
因为您的 运行 线程没有向打开的文件对象添加额外的引用,所以当 startWorker
函数完成时,不再有对对象的引用,它们将被删除,采取磁盘上的文件。
根据 documentation 此文件将被删除 "two" 次;
It will be destroyed as soon as it is closed (including an implicit close when the object is garbage collected).