diff --git a/nipype/pipeline/engine/utils.py b/nipype/pipeline/engine/utils.py index a5245dda48..218c30850b 100644 --- a/nipype/pipeline/engine/utils.py +++ b/nipype/pipeline/engine/utils.py @@ -236,17 +236,17 @@ def save_resultfile(result, cwd, name, rebase=None): if result.outputs is None: logger.warning('Storing result file without outputs') - savepkl(resultsfile, result) + savepkl(resultsfile, result, sync=True) return try: output_names = result.outputs.copyable_trait_names() except AttributeError: logger.debug('Storing non-traited results, skipping rebase of paths') - savepkl(resultsfile, result) + savepkl(resultsfile, result, sync=True) return if not rebase: - savepkl(resultsfile, result) + savepkl(resultsfile, result, sync=True) return backup_traits = {} @@ -262,7 +262,7 @@ def save_resultfile(result, cwd, name, rebase=None): backup_traits[key] = old val = rebase_path_traits(result.outputs.trait(key), old, cwd) setattr(result.outputs, key, val) - savepkl(resultsfile, result) + savepkl(resultsfile, result, sync=True) finally: # Restore resolved paths from the outputs dict no matter what for key, val in list(backup_traits.items()): diff --git a/nipype/utils/filemanip.py b/nipype/utils/filemanip.py index d846ce4bca..ca82778e7d 100644 --- a/nipype/utils/filemanip.py +++ b/nipype/utils/filemanip.py @@ -789,18 +789,20 @@ def read_stream(stream, logger=None, encoding=None): return out.splitlines() -def savepkl(filename, record, versioning=False): - pklopen = gzip.open if filename.endswith('.pklz') else open - with SoftFileLock('%s.lock' % filename): - with pklopen(filename, 'wb') as pkl_file: - if versioning: - from nipype import __version__ as version - metadata = json.dumps({'version': version}) - - pkl_file.write(metadata.encode('utf-8')) - pkl_file.write('\n'.encode('utf-8')) - - pickle.dump(record, pkl_file) +def savepkl(filename, record, versioning=False, sync=False): + with open(filename, 'wb') as fobj: + pkl_file = gzip.GzipFile(fileobj=fobj) if filename.endswith('.pklz') else fobj + if versioning: + from nipype import __version__ as version + metadata = json.dumps({'version': version}) + + pkl_file.write(metadata.encode('utf-8')) + pkl_file.write('\n'.encode('utf-8')) + + pickle.dump(record, pkl_file) + if sync: + fobj.flush() + os.fsync(fobj.fileno()) rst_levels = ['=', '-', '~', '+']