繁体   English   中英

Python NamedTemporaryFile已删除而不关闭它

[英]Python NamedTemporaryFile deleted without closing it

我正在使用ZOPE和Python 2.4,并且根据NamedTemporaryFile遇到问题。 我读到该文件在关闭时会被删除,但是无论如何我的文件都会被删除。 我有一个函数,可以使用Python的threading.Thread将一些xml规范写入文件。 如果线程完成,则将文件名写入会话变量。 我有另一个函数,应该在线程完成后打开文件。 这是一个JS函数,每隔10秒检查一次状态是否为true。 到目前为止,此功能正常运行,但是当我尝试通过文件名打开文件时,该文件已被删除。

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是没有选择的。

您将忽略 MyThread.__init__()zfsf对象; *args保持不变。

因为您正在运行的线程没有在打开的文件对象上添加其他引用,所以在startWorker函数完成时,不再有剩余的对象引用,它们将被删除,并带有磁盘上的文件。

根据文档 ,此文件将被“删除”两次;

它将在关闭后立即销毁(包括在垃圾回收对象时的隐式关闭)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM