删除Python NamedTemporaryFile而不关闭它

时间:2015-02-10 12:36:19

标签: python python-multithreading temporary-files

我正在使用ZOPE和Python 2.4,根据NamedTemporaryFile我遇到了问题。我读到该文件在关闭时被删除,但不知怎的,我的文件被删除了,即使它不是。 我有一个函数,它使用Python的threading.Thread将一些xml规范写入文件。如果线程完成,  文件名被写入会话变量。我有另一个函数,应该在线程完成时打开文件。它是一个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中删除= false是没有选择的。

2 个答案:

答案 0 :(得分:3)

忽略 zf中的sfMyThread.__init__()个对象; *args未受影响。

因为正在运行的线程没有添加对打开文件对象的其他引用,所以当startWorker函数完成时,没有更多的引用留给对象并且它们被删除,带有磁盘文件它们。

答案 1 :(得分:1)

根据documentation,有"两个"次此文件将被删除;

  

它会在关闭时被销毁(包括隐含的   当对象被垃圾收集时关闭。)