def load(filename, gzip=False, lock=None, timeout=None): """ Unpickle an object from filename @param filename: Filename pickled object @param gzip: Use gzip to uncompress the file @type gzip: Boolean @param lock: Use a lockfile to restrict access @return: Python object unpickled from file """ ## file locked? filename = os.path.expanduser(filename) if lock is not None: lockdir = filename + '.lock' if timeout is not None and timeout > 0: end_time = timeout + time.time() while True: try: os.mkdir(lockdir) except OSError as e: # File is already locked if e.errno == errno.EEXIST: if timeout is not None and time.time() > end_time: raise IOError("Failed to acquire Lock") else: raise IOError("Failed to acquire Lock") else: break if gzip: import gzip stream = gzip.GzipFile(filename) try: stream.readline() stream.seek(0) except: stream.close() raise else: stream = open(filename, 'rb') try: this = Pickle.load(stream) except: stream.close() import Numeric #@UnresolvedImport try: stream = gzip.GzipFile(filename) except: stream = open(filename, 'rb') try: unpickler = Numeric.Unpickler(stream) this = unpickler.load() except: stream.close() raise stream.close() if lock is not None: ## release lock try: os.rmdir(lockdir) except: raise IOError('missing lockfile {0}'.format(lockdir)) return this