Spaces:
Paused
Paused
| 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 |