From a8321e0ef01cacdd65830344ffc21fa4559e631b Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr> Date: Tue, 27 Jun 2023 09:47:30 +0200 Subject: [PATCH] Solver: Add input and output command features. --- src/Solver/ASolver.py | 75 +++++++++++++++++++++++++++++++------------ tools/ssh-input.sh | 9 ++++++ tools/ssh-output.sh | 8 +++++ tools/ssh-run.sh | 10 ++++++ 4 files changed, 81 insertions(+), 21 deletions(-) create mode 100755 tools/ssh-input.sh create mode 100755 tools/ssh-output.sh create mode 100755 tools/ssh-run.sh diff --git a/src/Solver/ASolver.py b/src/Solver/ASolver.py index 371edcad..ab426a00 100644 --- a/src/Solver/ASolver.py +++ b/src/Solver/ASolver.py @@ -151,7 +151,22 @@ class AbstractSolver(object): if self._cmd_input == "": return True - return False + cmd = self._cmd_input + cmd = cmd.replace("@path", self._path_input) + cmd = cmd.replace("@input", self.input_param()) + cmd = cmd.replace("@dir", self._process.workingDirectory()) + + print(f"+ {cmd}") + + cmd = cmd.split() + exe = cmd[0] + args = cmd[1:] + + self._process.start( + exe, args, + ) + + return True def run_solver(self): if self._cmd_solver == "": @@ -160,6 +175,9 @@ class AbstractSolver(object): cmd = self._cmd_solver cmd = cmd.replace("@path", self._path_solver) cmd = cmd.replace("@input", self.input_param()) + cmd = cmd.replace("@dir", self._process.workingDirectory()) + + print(f"+ {cmd}") cmd = cmd.split() exe = cmd[0] @@ -168,8 +186,6 @@ class AbstractSolver(object): self._process.start( exe, args, ) - self._process.readyRead.connect(self._data_ready) - self._process.finished.connect(self._finished) self._status = STATUS.RUNNING return True @@ -177,8 +193,22 @@ class AbstractSolver(object): def run_output_data_fomater(self): if self._cmd_output == "": return True + cmd = self._cmd_output + cmd = cmd.replace("@path", self._path_output) + cmd = cmd.replace("@input", self.input_param()) + cmd = cmd.replace("@dir", self._process.workingDirectory()) - return False + print(f"+ {cmd}") + + cmd = cmd.split() + exe = cmd[0] + args = cmd[1:] + + self._process.start( + exe, args, + ) + + return True def _data_ready(self): s = self._process.readAll().data().decode() @@ -189,15 +219,29 @@ class AbstractSolver(object): def _finished(self, exit_code, exit_status): if self._output is not None: self._output.put(exit_code) - self._status = STATUS.STOPED + + if self._step < len(self._runs): + self._runs[self._step]() + self._step += 1 + else: + self._status = STATUS.STOPED def run(self, process, output_queue): self._process = process self._output = output_queue - if self.run_input_data_fomater(): - if self.run_solver(): - return self.run_output_data_fomater() + self._process.readyRead.connect(self._data_ready) + self._process.finished.connect(self._finished) + + self._step = 0 + self._runs = [ + self.run_input_data_fomater, + self.run_solver, + self.run_output_data_fomater, + ] + + self._runs[self._step]() + self._step += 1 def kill(self): if self._process is None: @@ -215,11 +259,9 @@ class AbstractSolver(object): if self._status == STATUS.PAUSED: os.kill(self._process.pid(), SIGCONT) self._status = STATUS.RUNNING - else: - self.run_solver() - else: - self.run_solver() + return True + self.run_solver() return True def pause(self): @@ -239,12 +281,3 @@ class AbstractSolver(object): self._process.terminate() self._status = STATUS.STOPED return True - - - def wait(self): - if self._process is None: - return False - - self._process.wait() - self._status = STATUS.STOPED - return True diff --git a/tools/ssh-input.sh b/tools/ssh-input.sh new file mode 100755 index 00000000..7d79cc7d --- /dev/null +++ b/tools/ssh-input.sh @@ -0,0 +1,9 @@ +#! /bin/sh + +# > ssh-input.sh SERVER DESTDIR + +# First argument is the server name/addr +# The second argument is the destination directory to copy input data + +ssh $1 mkdir -p $2 +scp ./* $1:$2 diff --git a/tools/ssh-output.sh b/tools/ssh-output.sh new file mode 100755 index 00000000..f81584a0 --- /dev/null +++ b/tools/ssh-output.sh @@ -0,0 +1,8 @@ +#! /bin/sh + +# > ssh-output.sh SERVER DESTDIR + +# First argument is the server name/addr +# The second argument is the destination directory to copy input data + +scp $1:$2/* ./ diff --git a/tools/ssh-run.sh b/tools/ssh-run.sh new file mode 100755 index 00000000..9c59bb9f --- /dev/null +++ b/tools/ssh-run.sh @@ -0,0 +1,10 @@ +#! /bin/sh + +# > ssh-run.sh SERVER DESTDIR SOLVER INPUT + +# First argument is the server name/addr +# The second argument is the destination directory to copy input data +# The third argument is the solver path +# The fourth argument is the input name + +ssh $1 "cd $2; $3 $4" -- GitLab