| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- """
- This module is here to ensure compatibility of Windows/Linux/MacOS and
- different Python versions.
- """
- import errno
- import sys
- import pickle
- from typing import Any
- class Unpickler(pickle.Unpickler):
- def find_class(self, module: str, name: str) -> Any:
- # Python 3.13 moved pathlib implementation out of __init__.py as part of
- # generalising its implementation. Ensure that we support loading
- # pickles from 3.13 on older version of Python. Since 3.13 maintained a
- # compatible API, pickles from older Python work natively on the newer
- # version.
- if module == 'pathlib._local':
- module = 'pathlib'
- return super().find_class(module, name)
- def pickle_load(file):
- try:
- return Unpickler(file).load()
- # Python on Windows don't throw EOF errors for pipes. So reraise them with
- # the correct type, which is caught upwards.
- except OSError:
- if sys.platform == 'win32':
- raise EOFError()
- raise
- def pickle_dump(data, file, protocol):
- try:
- pickle.dump(data, file, protocol)
- # On Python 3.3 flush throws sometimes an error even though the writing
- # operation should be completed.
- file.flush()
- # Python on Windows don't throw EPIPE errors for pipes. So reraise them with
- # the correct type and error number.
- except OSError:
- if sys.platform == 'win32':
- raise IOError(errno.EPIPE, "Broken pipe")
- raise
|