Update February 3, 2017 I wrapped this in a memory_util package. Usage example
# install memory util import urllib.request response = urllib.request.urlopen("https://raw.githubusercontent.com/yaroslavvb/memory_util/master/memory_util.py") open("memory_util.py", "wb").write(response.read()) import memory_util sess = tf.Session() a = tf.random_uniform((1000,)) b = tf.random_uniform((1000,)) c = a + b with memory_util.capture_stderr() as stderr: sess.run(c.op) print(stderr.getvalue())
** Old material **
You can reuse the FD redirector from the IPython kernel. (idea from Mark Sandler)
import os import sys STDOUT = 1 STDERR = 2 class FDRedirector(object): """ Class to redirect output (stdout or stderr) at the OS level using file descriptors. """ def __init__(self, fd=STDOUT): """ fd is the file descriptor of the outpout you want to capture. It can be STDOUT or STERR. """ self.fd = fd self.started = False self.piper = None self.pipew = None def start(self): """ Setup the redirection. """ if not self.started: self.oldhandle = os.dup(self.fd) self.piper, self.pipew = os.pipe() os.dup2(self.pipew, self.fd) os.close(self.pipew) self.started = True def flush(self): """ Flush the captured output, similar to the flush method of any stream. """ if self.fd == STDOUT: sys.stdout.flush() elif self.fd == STDERR: sys.stderr.flush() def stop(self): """ Unset the redirection and return the captured output. """ if self.started: self.flush() os.dup2(self.oldhandle, self.fd) os.close(self.oldhandle) f = os.fdopen(self.piper, 'r') output = f.read() f.close() self.started = False return output else: return '' def getvalue(self): """ Return the output captured since the last getvalue, or the start of the redirection. """ output = self.stop() self.start() return output import tensorflow as tf x = tf.constant([1,2,3]) a=tf.Print(x, [x]) redirect=FDRedirector(STDERR) sess = tf.InteractiveSession() redirect.start(); a.eval(); print "Result" print redirect.stop()
Yaroslav bulatov
source share