我試圖週期性地將一些測量寫入到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
任何解釋,爲什麼?
你有很多RepeatTimer線程運行?如果是的話,兩個線程都試圖寫入文件,所以可能會發生這樣的情況:一個線程試圖在文件剛剛被另一個線程關閉時寫入文件,並且應該使用Lock來防止對該文件進行共同訪問。 – MatToufoutu 2011-03-09 09:12:06
我有兩個RepeatTimer線程正在運行。一個人不斷地ping一個目標(遠程服務器)進行活動檢查,但不訪問任何文件。第二個是如上所述的日誌記錄。我會谷歌鎖定方法和調查。謝謝。 – siva 2011-03-09 14:35:30
添加:實際上該文件有一些日誌寫入腳本,如預期的那樣。但仍然是解釋器上的錯誤表面。也許與for循環有關。 – siva 2011-03-09 14:43:19