2011-03-09 52 views
1

我試圖週期性地將一些測量寫入到txt文件中。 (一些日誌記錄)。Python:寫入/附加到線程類中的文件錯誤

要定期運行一個函數,有一個RepeatTimer類。爲了運行更新文件的功能,我有一個VTlog()函數,如下所示。

class RepeatTimer(Thread): 
    def __init__(self, interval, function, iterations=0, args=[], kwargs={}): 
     Thread.__init__(self) 
     self.interval = interval 
     self.function = function 
     self.iterations = iterations 
     self.args = args 
     self.kwargs = kwargs 
     self.finished = Event() 

    def run(self): 
     count = 0 
     while not self.finished.isSet() and (self.iterations <= 0 or count < self.iterations): 
      self.finished.wait(self.interval) 
      if not self.finished.isSet(): 
       self.function(*self.args, **self.kwargs) 
       count += 1 

    def cancel(self): 
     self.finished.set() 



def LogVT(): 
    tgt_picks = [t1,t2] #modify here for selective targets 
    for tgt in tgt_picks: 
     tt = tgt 
     file = ('c:/vtlogs_%s.txt' % str(tt.target_name)) 
     x = str(tt.voltage('v_1p05_gfx_uncore')) + ', ' + str(tt.voltage('v_1p5_sm')) + ', ' + str(tt.temperature('pch_temp')) 
     q = time.strftime('%m/%d/%y, %H:%M:%S') 
     filehandle = open(file, 'a') 
     filehandle.write('\n' + q + ', ' + x) 
     filehandle.close() 
     time.sleep(3) 


logtimer = RepeatTimer(60.0, LogVT) 
logtimer.start() 

'x'和'q'在離線查詢時單獨工作。 t1是&的溫度測量裝置。 API已經啓動。

我的問題是,林在運行時得到這樣的:

Traceback (most recent call last): 
    File "C:\Python25\lib\logging\__init__.py", line 750, in emit 
    self.stream.write(fs % msg) 
ValueError: I/O operation on closed file 

任何解釋,爲什麼?

+2

你有很多RepeatTimer線程運行?如果是的話,兩個線程都試圖寫入文件,所以可能會發生這樣的情況:一個線程試圖在文件剛剛被另一個線程關閉時寫入文件,並且應該使用Lock來防止對該文件進行共同訪問。 – MatToufoutu 2011-03-09 09:12:06

+0

我有兩個RepeatTimer線程正在運行。一個人不斷地ping一個目標(遠程服務器)進行活動檢查,但不訪問任何文件。第二個是如上所述的日誌記錄。我會谷歌鎖定方法和調查。謝謝。 – siva 2011-03-09 14:35:30

+0

添加:實際上該文件有一些日誌寫入腳本,如預期的那樣。但仍然是解釋器上的錯誤表面。也許與for循環有關。 – siva 2011-03-09 14:43:19

回答

0

我認爲你應該檢查open()是否正確完成,並且在對該文件句柄進行任何調用write()close()之前事實上已返回文件句柄或發生錯誤。

------------ -----------修正

您應該檢查是否open()正確,但沒有這樣做,因爲我上面提到的振振有辭。如果無法打開文件,open()將會提升IOError,所以這與您的問題無關。

正如Mat建議的,線程可能是這個原因。嘗試這樣的:

... 

    def run(self): 
     count = 0 
     # creating a lock 
     lock = Lock() 
     while not self.finished.isSet() and (self.iterations <= 0 or count < self.iterations): 
      self.finished.wait(self.interval) 
      if not self.finished.isSet(): 
       # call function with lock 
       self.function(lock, *self.args, **self.kwargs) 
       count += 1 

... 

def LogVT(lock): 
    tgt_picks = [t1,t2] #modify here for selective targets 
    for tgt in tgt_picks: 
     tt = tgt 
     file = ('c:/vtlogs_%s.txt' % str(tt.target_name)) 
     x = str(tt.voltage('v_1p05_gfx_uncore')) + ', ' + str(tt.voltage('v_1p5_sm')) + ', ' + str(tt.temperature('pch_temp')) 
     q = time.strftime('%m/%d/%y, %H:%M:%S') 
     # lock while doing file operations 
     lock.acquire() 
     filehandle = open(file, 'a') 
     filehandle.write('\n' + q + ', ' + x) 
     filehandle.close() 
     # unlock 
     lock.release() 
     time.sleep(3) 

... 
+0

那麼..字符串值已經正確地附加在vtlog_target1.txt中。但解釋者給出了這個錯誤。 – siva 2011-03-09 09:31:39