2015-02-10 4 views
0

Я работаю с ZOPE и Python 2.4, и у меня есть проблема в соответствии с NamedTemporaryFile. Я прочитал, что файл удален, когда он закрыт, но каким-то образом мой файл удаляется, даже если это не так. У меня есть функция, которая записывает некоторые спецификации xml в файл с потоком Python. Thread. Если поток завершен, имя файла записывается в переменную сеанса. У меня есть еще одна функция, которая должна открыть файл, когда поток будет завершен. Это функция JS, которая проверяет каждые 10 секунд, если статус имеет значение true. Это работает до сих пор, но когда я пытаюсь открыть файл по его имени файла, он уже удален.Python 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 является обработка TempFiles? Я работаю с python 2.4, поэтому delete = false в NamedTemporaryFile нет опции.

ответ

3

Вы игнорируя в zf и sf объекты в MyThread.__init__(); *args остается нетронутым.

Потому что ваша текущая нить не добавляет дополнительных ссылок на открытый файловый объект, к моменту завершения функции startWorker нет объектов, оставшихся до объекта, и они удаляются, беря с собой файл на диске.

+0

Спасибо, сейчас работает! –

+0

Мне очень жаль, что я был счастлив поститься. Я изменил свой код выше и все еще файл удален. Может быть, причина в том, что я останавливаю тему? –

+0

@ user3891252: Да, вы останавливаете «мифот», почему вы это делаете, если хотите продолжить? Между прочим, я бы не использовал здесь нить. Я бы создал новый временный каталог и периодически выполнял бы удаление таких временных каталогов автоматически, если они старше заданного временного предела. –

1

В соответствии с documentation есть «два» момента, когда этот файл будет удален;

Он будет уничтожен, как только он будет закрыт (включая неявный , когда объект будет собран мусором).