Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>There is a simple solution (with full copy on open for read access and full copy on close with write access):</p> <pre><code>import os import shutil from tempfile import mkstemp class CachedFileObject(object): def __init__(self, cache_dir="/tmp"): self.cache_dir = cache_dir self.local_file = None self.local_path = None self.remote_path = None self.mode = None def open(self, path, mode="r", buffering=-1): if self.local_file and not self.local_file.closed: raise ValueError("Already open") fd, self.local_path = mkstemp(dir=self.cache_dir) os.close(fd) try: if "r" in mode and not os.path.exists(path): raise ValueError("No such remote file") if os.path.exists(path): # have remote file self._cache_remote(path, self.local_path) self.local_file = open(self.local_path, mode=mode, buffering=buffering) self.mode = mode self.remote_path = path except Exception as e: os.unlink(self.local_path) raise return self def close(self): self.local_file.close() try: if set("wa+").intersection(set(self.mode)): # have writes, sync file back to remote side self._sync_remote(self.remote_path, self.local_path) finally: os.unlink(self.local_path) def _cache_remote(self, remote_path, local_path): # simple cp shutil.copy(remote_path, local_path) def _sync_remote(self, remote_path, local_path): shutil.copy(local_path, remote_path) def __getattr__(self, attr): if self.local_file is not None: return getattr(self.local_file, attr) else: raise ValueError("File is not opened") </code></pre> <p>Created object will behavior as regular file, and just copy/sync on open/close.</p> <p>Usage:</p> <pre><code>f = CachedFileObject(cache_dir="/your/tmp/dir") f.open("/path/to/remote/file") # ..your f.read()'s here.. f.close() </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload