Spaces:
Sleeping
Sleeping
import os | |
import sys | |
import tempfile | |
# for stopping std out from concorde solver | |
# https://github.com/machine-reasoning-ufrgs/TSP-GNN/blob/master/redirector.py | |
STDOUT = 1 | |
STDERR = 2 | |
class Redirector(object): | |
def __init__(self, fd=STDOUT): | |
self.fd = fd | |
self.started = False | |
def start(self): | |
if not self.started: | |
self.tmpfd, self.tmpfn = tempfile.mkstemp() | |
self.oldhandle = os.dup(self.fd) | |
os.dup2(self.tmpfd, self.fd) | |
os.close(self.tmpfd) | |
self.started = True | |
def flush(self): | |
if self.fd == STDOUT: | |
sys.stdout.flush() | |
elif self.fd == STDERR: | |
sys.stderr.flush() | |
def stop(self): | |
if self.started: | |
self.flush() | |
os.dup2(self.oldhandle, self.fd) | |
os.close(self.oldhandle) | |
tmpr = open(self.tmpfn, 'rb') | |
output = tmpr.read() | |
tmpr.close() # this also closes self.tmpfd | |
os.unlink(self.tmpfn) | |
self.started = False | |
return output | |
else: | |
return None | |
class RedirectorOneFile(object): | |
def __init__(self, fd=STDOUT): | |
self.fd = fd | |
self.started = False | |
self.inited = False | |
self.initialize() | |
def initialize(self): | |
if not self.inited: | |
self.tmpfd, self.tmpfn = tempfile.mkstemp() | |
self.pos = 0 | |
self.tmpr = open(self.tmpfn, 'rb') | |
self.inited = True | |
def start(self): | |
if not self.started: | |
self.oldhandle = os.dup(self.fd) | |
os.dup2(self.tmpfd, self.fd) | |
self.started = True | |
def flush(self): | |
if self.fd == STDOUT: | |
sys.stdout.flush() | |
elif self.fd == STDERR: | |
sys.stderr.flush() | |
def stop(self): | |
if self.started: | |
self.flush() | |
os.dup2(self.oldhandle, self.fd) | |
os.close(self.oldhandle) | |
output = self.tmpr.read() | |
self.pos = self.tmpr.tell() | |
self.started = False | |
return output | |
else: | |
return None | |
def close(self): | |
if self.inited: | |
self.flush() | |
self.tmpr.close() # this also closes self.tmpfd | |
os.unlink(self.tmpfn) | |
self.inited = False | |
return output | |
else: | |
return None |