Source code for Mordicus.Core.IO.ExternalSolvingProcedure
# coding: utf-8
import subprocess
import shlex
import os.path as osp
from string import Template
[docs]class ExternalSolvingProcedure(object):
"""
This objects says how to call an external solver from Mordicus
Attributes
----------
solverCfg : dict
dictionary of environment variables useful to the call procedure
solverCallProcedureType : str
one of ("shell", "python"), tells what to execute the script with
callScript : str
launching script
"""
def __init__(self, **kwargs):
"""
Constructor
"""
list_argnames = ["solverCfg", "solverCallProcedureType", "callScript", "PythonPreprocessing"]
for name in list_argnames:
if name in kwargs:
setattr(self, name, kwargs[name])
[docs] def Execute(self, script):
"""
Executes as_run as a script
Parameters
----------
script : str
shell script to execute
Returns
-------
int
return code
"""
if hasattr(self, "solverCfg"):
script = script.format(**self.solverCfg)
seq = shlex.split(script)
ret = subprocess.run(seq, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#print(str(ret.stdout).replace('\\n', '\n'))
return ret
[docs] def importMordicusData(self, inputData):
"""
Sets input files from mordicus into launch procedure
Parameters
----------
inputData: dict
dictionary with str as key (used as key to substitute in template of inputMainFile and input_instruction_file)
and str as values (value to substitute with)
"""
mordicusData = inputData.pop("input_mordicusData", {})
inputInstructionFilePath = osp.join(inputData["inputRootFolder"], inputData["inputMainFile"])
with open(inputInstructionFilePath, "r") as f:
mystr = f.read()
mytemplate = Template(mystr)
kws = {k: str(v) for k,v in mordicusData.items()}
myinstance = mytemplate.safe_substitute(**kws)
with open(inputInstructionFilePath, "w") as f:
f.write(myinstance)
def __str__(self):
res = "ExternalSolvingProcedure\n"
res += "solverCfg : " + str(self.solverCfg) + "\n"
res += "solverCallProcedureType : " + str(self.solverCallProcedureType) + "\n"
res += "callScript : " + str(self.callScript)
return res
[docs] def accept(self, visitor):
"""
Accept visitor
"""
return visitor.visitSolver(self)
if __name__ == "__main__":# pragma: no cover
from Mordicus import RunTestFile
RunTestFile(__file__)