__all__ = ['ExecutableResource'] import os.path from pyutilib.workflow import resource import pyutilib.services import pyutilib.subprocess # TODO: add support for logging class ExecutableResource(resource.Resource): def __init__(self, name=None, executable=None): resource.Resource.__init__(self) if name is None and not executable is None: name = os.path.basename(executable) if executable is None: executable = name self.register(name, executable) def register(self, name, executable): self.filename = executable if name is None: # TBD: when is this branch executed? self.description = "Executable" + self.id self.name = self.description else: self.description = "Executable_" + name self.name = name pyutilib.services.register_executable(executable) def run(self, args, logfile=None, debug=False): executable = pyutilib.services.registered_executable(self.filename) if executable is None: # TBD: tests generating this error do not cause global exceptions in a workflow ... raise IOError("Cannot find executable '%s'" % self.filename) cmd = executable.get_path() + " " + args if debug: print("Running... %s" % cmd) pyutilib.subprocess.run(cmd, outfile=logfile) def available(self): return not pyutilib.services.registered_executable( self.filename) is None