| |
|
|
| import ConfigParser |
| import os |
| import subprocess |
| import sys |
|
|
| from PyQt4.QtCore import ( |
| QObject, |
| SIGNAL, |
| ) |
|
|
| from util import doAlert |
|
|
|
|
| class Engine(QObject): |
| def __init__(self, model, moses): |
| super(Engine, self).__init__() |
| self.model = model |
| self.moses = moses |
| self.check(self.model) |
| |
| |
| modelini = model['path'] + os.sep + 'model' + os.sep + 'model.ini' |
| if not os.path.exists(modelini): |
| raise Exception( |
| "Model ini file doesn't exist, please check model dir %s" |
| % modelini) |
| cp = ConfigParser.RawConfigParser() |
| cp.readfp(open(modelini)) |
| truemodel = None |
| try: |
| truemodel = cp.get("Preprocess", 'Truemodel') |
| truemodel_path = os.path.join(model['path'], 'model', truemodel) |
| if not os.path.exists(truemodel_path): |
| doAlert("Truemodel doesn't exist, ignore %s" % truemodel) |
| truemodel = None |
| except: |
| |
| truemodel = None |
| self.cmds = [] |
| |
| self.cmds.append( |
| '"%s" -q -l %s -noxml' |
| % (self.moses.getTokenizer(), str(model['srclang']).lower())) |
| if truemodel is not None: |
| self.cmds.append( |
| '"%s" -model "%s"' % (self.moses.getTruecase(), truemodel)) |
| self.cmds.append('"%s" -f moses.ini' % self.moses.getMosesCmd()) |
| self.cmds.append('"%s"' % self.moses.getDetruecase()) |
| self.cmds.append( |
| '"%s" -q -noxml -l %s' |
| % (self.moses.getDetokenizer(), str(model['trglang']).lower())) |
| self.process = [] |
| |
|
|
| def check(self, model): |
| model_path_exists = os.path.exists(model['path']) |
| model_mosesini_exists = os.path.exists(model['mosesini']) |
| if not model_path_exists or not model_mosesini_exists: |
| raise Exception( |
| "Model file doesn't exist, please check model dir %s" |
| % self.model['path']) |
|
|
| def countSteps(self): |
| return len(self.cmds) + 1 |
|
|
| def start(self): |
| |
| try: |
| self.emit(SIGNAL("stepFinished(int)"), 0) |
| for i, cmd in enumerate(self.cmds): |
| proc = subprocess.Popen( |
| cmd, shell=True, stdin=subprocess.PIPE, |
| stdout=subprocess.PIPE, |
| cwd=os.path.join(str(self.model['path']), 'model')) |
| self.process.append(proc) |
| if not proc.poll() is None: |
| raise Exception("Failed to start engine!") |
| proc.stdin.write("dummy\n") |
| proc.stdin.flush() |
| if len(proc.stdout.readline().strip()) <= 0: |
| raise Exception( |
| "Engine process exited: [%s] in folder [%s]" |
| % ( |
| cmd, |
| os.path.join(str(self.model['path']), 'model'))) |
| self.emit(SIGNAL("stepFinished(int)"), i + 1) |
| self.emit(SIGNAL("loaded(bool, QString)"), True, "Model Loaded") |
| except Exception as e: |
| self.emit( |
| SIGNAL("loaded(bool, QString)"), False, |
| "Failed to load Model: %s" % str(e)) |
|
|
| def stop(self): |
| for process in self.process: |
| |
| |
| process.terminate() |
| process.wait() |
| self.process = [] |
|
|
| def translate(self, input): |
| lastInput = input |
| try: |
| for i, proc in enumerate(self.process): |
| if not proc.poll() is None: |
| raise Exception("Failed to start engine!") |
| proc.stdin.write("%s\n" % lastInput) |
| proc.stdin.flush() |
| output = proc.stdout.readline().strip() |
| lastInput = output |
| return output |
| except Exception, e: |
| print >> sys.stderr, "Translate error: %s" % str(e) |
| return lastInput |
|
|