diff --git a/ArgParser.py b/ArgParser.py new file mode 100644 index 0000000..ba9e26b --- /dev/null +++ b/ArgParser.py @@ -0,0 +1,81 @@ +import os +import os.path + +class ArgParser: + def __init__(self): + self.i = 0 + self.args = [] + + def parse_type(self, make_type): + opt = self.args[self.i] + self.i += 1 + if self.i >= len(self.args): + return ("Not enough params to " + opt, None) + val = None + try: + val = self.args[self.i] if make_type is None else make_type(self.args[self.i]) + except Exception, e: + pass + if val is None: + return ("Bad argument to " + opt + ": " + self.args[self.i], None) + return (None, val) + + def possible(self, opts, make_type): + return lambda v: make_type(v) if v in opts else None + + def condition(self, make_type, condition): + return lambda v: make_type(v) if condition(make_type(v)) else None + + def folder(self, v): + path = abspath(v) + if os.path.isdir(path): + return path + return None + + def parse_args(self, args): + self.args = args + self.i = 0 + ret = {"input":[]} + allow_opts = True + + while self.i < len(self.args): + arg = self.args[self.i].strip() + if arg == "--": + allow_opts = False + self.i += 1 + continue + + if arg == "--port" or arg == "-p": + (msg, p) = self.parse_type(int) + if msg is not None: + return (msg, None) + ret["port"] = p + elif arg == "--type" or arg == "-t": + (msg, t) = self.parse_type(self.possible(["1", "3"], int)) + if msg is not None: + return (msg, None) + ret["type"] = t + elif arg == "--scale" or arg == "-s": + (msg, s) = self.parse_type(self.condition(int, lambda s: s > 0.00001)) + if msg is not None: + return (msg, None) + ret["scale"] = s + elif arg == "--base" or arg == "-b": + (msg, b) = self.parse_type(self.folder) + if msg is not None: + return (msg, None) + ret["base"] = b + else: + ret["input"].append(arg) + self.i += 1 + return (None, ret) + +def abspath(path): + return os.path.abspath(os.path.expanduser(path)) + +def file_in_path(file, path): + file = abspath(file) + path = abspath(path) + if not os.path.isdir(path) or not os.path.isfile(file): + return False + return os.path.commonprefix(path, file) == path diff --git a/ArgParser.py b/ArgParser.py new file mode 100644 index 0000000..ba9e26b --- /dev/null +++ b/ArgParser.py @@ -0,0 +1,81 @@ +import os +import os.path + +class ArgParser: + def __init__(self): + self.i = 0 + self.args = [] + + def parse_type(self, make_type): + opt = self.args[self.i] + self.i += 1 + if self.i >= len(self.args): + return ("Not enough params to " + opt, None) + val = None + try: + val = self.args[self.i] if make_type is None else make_type(self.args[self.i]) + except Exception, e: + pass + if val is None: + return ("Bad argument to " + opt + ": " + self.args[self.i], None) + return (None, val) + + def possible(self, opts, make_type): + return lambda v: make_type(v) if v in opts else None + + def condition(self, make_type, condition): + return lambda v: make_type(v) if condition(make_type(v)) else None + + def folder(self, v): + path = abspath(v) + if os.path.isdir(path): + return path + return None + + def parse_args(self, args): + self.args = args + self.i = 0 + ret = {"input":[]} + allow_opts = True + + while self.i < len(self.args): + arg = self.args[self.i].strip() + if arg == "--": + allow_opts = False + self.i += 1 + continue + + if arg == "--port" or arg == "-p": + (msg, p) = self.parse_type(int) + if msg is not None: + return (msg, None) + ret["port"] = p + elif arg == "--type" or arg == "-t": + (msg, t) = self.parse_type(self.possible(["1", "3"], int)) + if msg is not None: + return (msg, None) + ret["type"] = t + elif arg == "--scale" or arg == "-s": + (msg, s) = self.parse_type(self.condition(int, lambda s: s > 0.00001)) + if msg is not None: + return (msg, None) + ret["scale"] = s + elif arg == "--base" or arg == "-b": + (msg, b) = self.parse_type(self.folder) + if msg is not None: + return (msg, None) + ret["base"] = b + else: + ret["input"].append(arg) + self.i += 1 + return (None, ret) + +def abspath(path): + return os.path.abspath(os.path.expanduser(path)) + +def file_in_path(file, path): + file = abspath(file) + path = abspath(path) + if not os.path.isdir(path) or not os.path.isfile(file): + return False + return os.path.commonprefix(path, file) == path diff --git a/driver.py b/driver.py new file mode 100644 index 0000000..ac004f6 --- /dev/null +++ b/driver.py @@ -0,0 +1,33 @@ +import socket +import os +import subprocess +import sys +import threading + +def get_driver_conn(): + s = socket.socket() + s.bind(("localhost", port)) + + s.settimeout(0.5) + s.listen(0) + + return s + +def get_driver_proc(): + exporter_proc_args = [os.getcwd() + "/Exporter.exe"] + #exporter_proc_args = [os.getcwd() + "/Exporter.app/Expoter.exe", str(port)] + return subprocess.Popen(exporter_proc_args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + +def get_stdin_queue(): + stdin_q = Queue.Queue() + reader = threading.Thread(target=get_stdin, args=(stdin_q,)) + reader.daemon = True + reader.start() + return stdin_q + +def get_stdin(stdin_q): + while True: + line = sys.stdin.readline() + stdin_q.put(line) + if line == "": + return diff --git a/ArgParser.py b/ArgParser.py new file mode 100644 index 0000000..ba9e26b --- /dev/null +++ b/ArgParser.py @@ -0,0 +1,81 @@ +import os +import os.path + +class ArgParser: + def __init__(self): + self.i = 0 + self.args = [] + + def parse_type(self, make_type): + opt = self.args[self.i] + self.i += 1 + if self.i >= len(self.args): + return ("Not enough params to " + opt, None) + val = None + try: + val = self.args[self.i] if make_type is None else make_type(self.args[self.i]) + except Exception, e: + pass + if val is None: + return ("Bad argument to " + opt + ": " + self.args[self.i], None) + return (None, val) + + def possible(self, opts, make_type): + return lambda v: make_type(v) if v in opts else None + + def condition(self, make_type, condition): + return lambda v: make_type(v) if condition(make_type(v)) else None + + def folder(self, v): + path = abspath(v) + if os.path.isdir(path): + return path + return None + + def parse_args(self, args): + self.args = args + self.i = 0 + ret = {"input":[]} + allow_opts = True + + while self.i < len(self.args): + arg = self.args[self.i].strip() + if arg == "--": + allow_opts = False + self.i += 1 + continue + + if arg == "--port" or arg == "-p": + (msg, p) = self.parse_type(int) + if msg is not None: + return (msg, None) + ret["port"] = p + elif arg == "--type" or arg == "-t": + (msg, t) = self.parse_type(self.possible(["1", "3"], int)) + if msg is not None: + return (msg, None) + ret["type"] = t + elif arg == "--scale" or arg == "-s": + (msg, s) = self.parse_type(self.condition(int, lambda s: s > 0.00001)) + if msg is not None: + return (msg, None) + ret["scale"] = s + elif arg == "--base" or arg == "-b": + (msg, b) = self.parse_type(self.folder) + if msg is not None: + return (msg, None) + ret["base"] = b + else: + ret["input"].append(arg) + self.i += 1 + return (None, ret) + +def abspath(path): + return os.path.abspath(os.path.expanduser(path)) + +def file_in_path(file, path): + file = abspath(file) + path = abspath(path) + if not os.path.isdir(path) or not os.path.isfile(file): + return False + return os.path.commonprefix(path, file) == path diff --git a/driver.py b/driver.py new file mode 100644 index 0000000..ac004f6 --- /dev/null +++ b/driver.py @@ -0,0 +1,33 @@ +import socket +import os +import subprocess +import sys +import threading + +def get_driver_conn(): + s = socket.socket() + s.bind(("localhost", port)) + + s.settimeout(0.5) + s.listen(0) + + return s + +def get_driver_proc(): + exporter_proc_args = [os.getcwd() + "/Exporter.exe"] + #exporter_proc_args = [os.getcwd() + "/Exporter.app/Expoter.exe", str(port)] + return subprocess.Popen(exporter_proc_args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + +def get_stdin_queue(): + stdin_q = Queue.Queue() + reader = threading.Thread(target=get_stdin, args=(stdin_q,)) + reader.daemon = True + reader.start() + return stdin_q + +def get_stdin(stdin_q): + while True: + line = sys.stdin.readline() + stdin_q.put(line) + if line == "": + return diff --git a/exporter.py b/exporter.py index 1520da2..764b76c 100755 --- a/exporter.py +++ b/exporter.py @@ -12,75 +12,7 @@ import struct import threading import Queue - -class ArgParser: - def __init__(self): - self.i = 0 - self.args = [] - - def parse_type(self, make_type): - opt = self.args[self.i] - self.i += 1 - if self.i >= len(self.args): - return ("Not enough params to " + opt, None) - val = None - try: - val = self.args[self.i] if make_type is None else make_type(self.args[self.i]) - except Exception, e: - pass - if val is None: - return ("Bad argument to " + opt + ": " + self.args[self.i], None) - return (None, val) - - def possible(self, opts, make_type): - return lambda v: make_type(v) if v in opts else None - - def condition(self, make_type, condition): - return lambda v: make_type(v) if condition(make_type(v)) else None - - def folder(self, v): - path = abspath(v) - if os.path.isdir(path): - return path - return None - - def parse_args(self, args): - self.args = args - self.i = 0 - ret = {"input":[]} - allow_opts = True - - while self.i < len(self.args): - arg = self.args[self.i].strip() - if arg == "--": - allow_opts = False - self.i += 1 - continue - - if arg == "--port" or arg == "-p": - (msg, p) = self.parse_type(int) - if msg is not None: - return (msg, None) - ret["port"] = p - elif arg == "--type" or arg == "-t": - (msg, t) = self.parse_type(self.possible(["1", "3"], int)) - if msg is not None: - return (msg, None) - ret["type"] = t - elif arg == "--scale" or arg == "-s": - (msg, s) = self.parse_type(self.condition(int, lambda s: s > 0.00001)) - if msg is not None: - return (msg, None) - ret["scale"] = s - elif arg == "--base" or arg == "-b": - (msg, b) = self.parse_type(self.folder) - if msg is not None: - return (msg, None) - ret["base"] = b - else: - ret["input"].append(arg) - self.i += 1 - return (None, ret) +import * from ArgParser def usage(): print "usage 1: ./exporter.py [--port/-p wrapper_communication_port] [--type/-t (1,3)] [--scale/-s skeletal_scale] [--base/-b base_dir] input_files..." @@ -116,46 +48,25 @@ port = args["port"] if "port" in args else 7890 -s = socket.socket() -s.bind(("localhost", port)) - -exporter_args = [os.getcwd() + "/Exporter.exe"] -#exporter_args = [os.getcwd() + "/Exporter.app/Expoter.exe", str(port)] -g = subprocess.Popen(exporter_args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - -s.settimeout(0.5) -s.listen(0) - -stdin_q = Queue.Queue() - -def get_stdin(): - while True: - line = sys.stdin.readline() - stdin_q.put(line) - if line == "": - return - -def make_base_cmd(args): +def make_base_job_args(args): return {"type": args["type"] if "type" in args else 1, \ "scale": args["scale"] if "scale" in args else 1} class Job: next_id = 0 - __init__(self, base_cmd, job_cmd): + def __init__(self, input, type = 1, scale = 1, base = None): + if not os.path.isfile(input): + raise Exception("Failed: couldn't open " + input) self.id = next_id next_id += 1 - - -num_jobs_sent = 0 -def send_job(conn, base_cmd, in_file): - global num_jobs_sent - num_jobs_sent += 1 - cmd = dict(base_cmd) - cmd["command"] = "job" - cmd["input"] = in_file - cmd["job_num"] = num_jobs_sent - send_msg(conn, cmd) - + self.input = abspath(input) + self.base = base if base is not None else os.path.split(input)[0] + if not file_in_path(self.input, self.base): + raise Exception("Failed: " + input + " is not in base dir " + self.base) + self.type = type + self.scale = scale + self.done = False + def send_msg(conn, msg): data = json.dumps(msg) datalen = struct.pack(">H", len(data)) @@ -176,17 +87,23 @@ sys.exit(1) g.poll() +jobs = {} + if conn: conn.setblocking(False) if from_stdin: - reader = threading.Thread(target=get_stdin) - reader.daemon = True - reader.start() + pass else: - base_cmd = make_base_cmd(args) + base_args = make_base_job_args(args) for i in args["input"]: - send_job(conn, base_cmd, i) + try: + job = Job(base_args, input = i) + jobs[job.id] = job + except Exception, e: + print e + + def handle_command(msg_str): global quit @@ -232,7 +149,7 @@ if err is not None: print err else: - base_cmd = make_base_cmd(line_args) + base_args= make_base_job_args(line_args) for i in line_args["input"]: send_job(conn, base_cmd, i) if quit: @@ -247,12 +164,3 @@ conn.close() s.close() -def abspath(path): - return os.path.abspath(os.path.expanduser(path)) - -def file_in_path(file, path): - file = abspath(file) - path = abspath(path) - if not os.path.isdir(path) or not os.path.isfile(file): - return False - return os.path.commonprefix(path, file) == path