#! /usr/bin/python import socket import subprocess import errno import sys import os import json import argparse class ArgumentParser(argparse.ArgumentParser): def _get_action_from_name(self, name): """Given a name, get the Action instance registered with this parser. If only it were made available in the ArgumentError object. It is passed as it's first arg... """ container = self._actions if name is None: return None for action in container: if '/'.join(action.option_strings) == name: return action elif action.metavar == name: return action elif action.dest == name: return action def has_dest(self, name): for a in self._actions: if a.dest == name: return True return False def error(self, message): exc = sys.exc_info()[1] if exc: exc.argument = self._get_action_from_name(exc.argument_name) raise exc super(ArgumentParser, self).error(message) port = 7890 job_parser = ArgumentParser(description="Specify an export job") job_parser.add_argument("input_swf", nargs="?", help="location of a .swf file to export") job_parser.add_argument("-t", "--type", default=1, help="export type: 1=spritesheet, 3=skeletal", choices=[1,3]) cmd_parser = ArgumentParser(description="Export .swf files, either from the command line or piped from stdin", parents=[job_parser], conflict_handler="resolve") cmd_parser.add_argument("-p", "--port", default=port, help="port to use for the wrapper server", type=int) try: cmd_args = cmd_parser.parse_args() except argparse.ArgumentError, exc: # only show cmd line errors for things *just* in the cmd_parser (we will parse other stuff later) if cmd_parser.has_dest(exc.argument.dest) and not job_parser.has_dest(exc.argument.dest): super(ArgumentParser, cmd_parser).error(exc.message) s = socket.socket() s.bind(("localhost", port)) args = [os.getcwd() + "/GraphicExport.exe"] # args = [os.getcwd() + "/GraphicExport.app/GraphicExport.exe", str(port)] g = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) s.settimeout(0.5) s.listen(0) conn = None while conn is None and g.returncode is None: try: (conn, _) = s.accept() except socket.timeout, e: pass except e: print e s.close() g.wait() sys.exit(1) g.poll() if conn: conn.setblocking(False) conn.send("EXPORT|" + "|".join(sys.argv[1:]) + "\0") while g.returncode is None: try: d = conn.recv(4096) if len(d): sys.stdout.write(d) sys.stdout.flush() except socket.error, e: if e.args[0] == errno.EWOULDBLOCK or e.args[0] == errno.EAGAIN: pass else: print e conn.close() s.close() g.wait() sys.exit(1) g.poll() if (conn): conn.close() s.close()