2015-02-10 116 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這個文件將被「刪除」兩次;

它一旦關閉就會被銷燬(包括對象被垃圾收集時隱含的 關閉)。