Skip to content

Commit 193ce54

Browse files
committed
BF: some machines weren't saving data correctly mid-experiment
Must have been something to do with ExperimentHandler not cleaning itself up (maybe due to a circular reference somewhere?) Adding the use of atexit as a second safety measure but keeping __del__ as well. This commit is taking the code from 89263ae and 24d3d83 but can't cherry-pick those due to restructured code
1 parent c555ca2 commit 193ce54

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

psychopy/data.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from scipy import optimize, special
1919
import inspect # so that Handlers can find the script that called them
2020
import codecs
21+
import atexit
2122
import weakref
2223
import re
2324
import warnings
@@ -112,6 +113,7 @@ def __init__(self,
112113
113114
autoLog : True (default) or False
114115
"""
116+
ExperimentHandler._instances.add(self)
115117
self.loops = []
116118
self.loopsUnfinished = []
117119
self.name = name
@@ -137,16 +139,11 @@ def __init__(self,
137139
else:
138140
# fail now if we fail at all!
139141
checkValidFilePath(dataFileName, makeValid=True)
142+
# make sure we close and save data when Python exits
143+
atexit.register(self.close)
140144

141145
def __del__(self):
142-
if self.dataFileName not in ['', None]:
143-
if self.autoLog:
144-
logging.debug(
145-
'Saving data for %s ExperimentHandler' % self.name)
146-
if self.savePickle == True:
147-
self.saveAsPickle(self.dataFileName)
148-
if self.saveWideText == True:
149-
self.saveAsWideText(self.dataFileName + '.csv', delim=',')
146+
self.close()
150147

151148
def addLoop(self, loopHandler):
152149
"""Add a loop such as a :class:`~psychopy.data.TrialHandler`
@@ -377,6 +374,23 @@ def saveAsPickle(self, fileName, fileCollisionMethod='rename'):
377374
self.savePickle = savePickle
378375
self.saveWideText = saveWideText
379376

377+
def close(self):
378+
"""Cleanly close the experiment and save files if needed.
379+
380+
This method isn't usually needed by the user - it is called at exit
381+
by the Python instance
382+
"""
383+
if self.dataFileName not in ['', None]:
384+
if self.autoLog:
385+
logging.debug(u'Saving data for %s ExperimentHandler'
386+
% self.name)
387+
if self.savePickle:
388+
self.saveAsPickle(self.dataFileName)
389+
if self.saveWideText:
390+
self.saveAsWideText(self.dataFileName + '.csv', delim=',')
391+
self.abort()
392+
self.autoLog = False
393+
380394
def abort(self):
381395
"""Inform the ExperimentHandler that the run was aborted.
382396

0 commit comments

Comments
 (0)