|
21 | 21 | import contextlib
|
22 | 22 | import posixpath
|
23 | 23 | import simplejson as json
|
| 24 | +from filelock import SoftFileLock |
24 | 25 |
|
25 | 26 | from builtins import str, bytes, open
|
26 | 27 |
|
@@ -684,36 +685,33 @@ def loadpkl(infile):
|
684 | 685 |
|
685 | 686 | unpkl = None
|
686 | 687 | with indirectory(infile.parent):
|
687 |
| - pkl_file = pklopen(infile.name, 'rb') |
688 |
| - |
689 |
| - try: # Look if pkl file contains version file |
690 |
| - pkl_metadata_line = pkl_file.readline() |
691 |
| - pkl_metadata = json.loads(pkl_metadata_line) |
692 |
| - except (UnicodeDecodeError, json.JSONDecodeError): |
693 |
| - # Could not get version info |
694 |
| - pkl_file.seek(0) |
695 |
| - |
696 |
| - try: |
697 |
| - unpkl = pickle.load(pkl_file) |
698 |
| - except UnicodeDecodeError: |
699 |
| - # Was this pickle created with Python 2.x? |
700 |
| - unpkl = pickle.load(pkl_file, fix_imports=True, encoding='utf-8') |
701 |
| - fmlogger.info('Successfully loaded pkl in compatibility mode.') |
702 |
| - # Unpickling problems |
703 |
| - except Exception as e: |
704 |
| - if pkl_metadata and 'version' in pkl_metadata: |
705 |
| - from nipype import __version__ as version |
706 |
| - if pkl_metadata['version'] != version: |
707 |
| - fmlogger.error("""\ |
| 688 | + with SoftFileLock('%s.lock' % infile.name): |
| 689 | + with pklopen(infile.name, 'rb') as pkl_file: |
| 690 | + try: # Look if pkl file contains version file |
| 691 | + pkl_metadata_line = pkl_file.readline() |
| 692 | + pkl_metadata = json.loads(pkl_metadata_line) |
| 693 | + except (UnicodeDecodeError, json.JSONDecodeError): |
| 694 | + # Could not get version info |
| 695 | + pkl_file.seek(0) |
| 696 | + try: |
| 697 | + unpkl = pickle.load(pkl_file) |
| 698 | + except UnicodeDecodeError: |
| 699 | + # Was this pickle created with Python 2.x? |
| 700 | + unpkl = pickle.load(pkl_file, fix_imports=True, encoding='utf-8') |
| 701 | + fmlogger.info('Successfully loaded pkl in compatibility mode.') |
| 702 | + # Unpickling problems |
| 703 | + except Exception as e: |
| 704 | + if pkl_metadata and 'version' in pkl_metadata: |
| 705 | + from nipype import __version__ as version |
| 706 | + if pkl_metadata['version'] != version: |
| 707 | + fmlogger.error("""\ |
708 | 708 | Attempted to open a results file generated by Nipype version %s, \
|
709 | 709 | with an incompatible Nipype version (%s)""", pkl_metadata['version'], version)
|
710 |
| - raise e |
711 |
| - fmlogger.error("""\ |
| 710 | + raise e |
| 711 | + fmlogger.error("""\ |
712 | 712 | No metadata was found in the pkl file. Make sure you are currently using \
|
713 | 713 | the same Nipype version from the generated pkl.""")
|
714 |
| - raise e |
715 |
| - finally: |
716 |
| - pkl_file.close() |
| 714 | + raise e |
717 | 715 |
|
718 | 716 | if unpkl is None:
|
719 | 717 | raise ValueError('Loading %s resulted in None.' % infile)
|
@@ -754,20 +752,17 @@ def read_stream(stream, logger=None, encoding=None):
|
754 | 752 |
|
755 | 753 |
|
756 | 754 | def savepkl(filename, record, versioning=False):
|
757 |
| - if filename.endswith('pklz'): |
758 |
| - pkl_file = gzip.open(filename, 'wb') |
759 |
| - else: |
760 |
| - pkl_file = open(filename, 'wb') |
761 |
| - |
762 |
| - if versioning: |
763 |
| - from nipype import __version__ as version |
764 |
| - metadata = json.dumps({'version': version}) |
| 755 | + pklopen = gzip.open if filename.endswith('.pklz') else open |
| 756 | + with SoftFileLock('%s.lock' % filename): |
| 757 | + with pklopen(filename, 'wb') as pkl_file: |
| 758 | + if versioning: |
| 759 | + from nipype import __version__ as version |
| 760 | + metadata = json.dumps({'version': version}) |
765 | 761 |
|
766 |
| - pkl_file.write(metadata.encode('utf-8')) |
767 |
| - pkl_file.write('\n'.encode('utf-8')) |
| 762 | + pkl_file.write(metadata.encode('utf-8')) |
| 763 | + pkl_file.write('\n'.encode('utf-8')) |
768 | 764 |
|
769 |
| - pickle.dump(record, pkl_file) |
770 |
| - pkl_file.close() |
| 765 | + pickle.dump(record, pkl_file) |
771 | 766 |
|
772 | 767 |
|
773 | 768 | rst_levels = ['=', '-', '~', '+']
|
|
0 commit comments