2015-02-10 85 views
0

我正在使用ZOPE和Python 2.4,并且根据NamedTemporaryFile有个问题。我读到文件在关闭时被删除,但不知何故,即使文件不是,我的文件也被删除。 我有一个函数,用python的threading.Thread将一些xml规范写入一个文件。如果线程完成, 文件名被写入会话变量。我有另一个功能,应该在线程完成时打开文件。这是一个JS函数,如果状态为真,则每10秒检查一次。这是迄今为止的工作,但是当我试图通过它的文件名打开文件时,它已被删除。蟒蛇NamedTemporaryFile删除而不关闭它

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

回答

3

您是忽略zfsfMyThread.__init__()中的对象; *args保持不变。

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

+0

现在感谢它的工作! – 2015-02-10 12:51:33

+0

我很抱歉,我认为我很高兴加快速度。我更改了上面的代码,但仍然删除了该文件。难道是因为我停止线程? – 2015-02-10 13:12:56

+0

@ user3891252:是的,你正在停止'mythread',为什么你要这样做,如果你想继续?顺便说一句,我不会在这里使用线程。我会创建一个新的临时目录,并且定期作业会自动删除这些临时目录,如果它们超过了给定的时间限制。 – 2015-02-10 13:17:06

1

根据documentation这个文件将被“删除”两次;

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