Mercurial > pyshada
view pysh.py @ 4:d502e401e136
add comment for testcase
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Mon, 28 Mar 2011 23:48:04 +0800 |
parents | f81d17014d31 |
children | dfc2c70ea62f |
line wrap: on
line source
import sys import os import comm def _run(cmd, inplace): def terminate_shell(args, env, session): yield while True: data = session.recv() if data == None: break sys.stdout.write(data) yield pass session.exit(0) server.close() pass def terminate_shell_inplace(args, env, session): yield while True: data = session.recv() if data == None: break inplace_blks.append(data) yield pass session.exit(0) server.close() pass prev_frame = sys._getframe().f_back.f_back prev_locals = prev_frame.f_locals prev_globals = prev_frame.f_globals ns = dict(prev_locals) ns['py'] = 'python -m shell_agent' if inplace: inplace_blks = [] ns['terminate_shell'] = terminate_shell_inplace else: ns['terminate_shell'] = terminate_shell pass server = comm.server(ns) server.listen() server_addr = server.get_addr() ns['PYSHELL_SERVER'] = server_addr env = ';'.join(['export %s="%s"' % (k, str(v).replace('\\', '\\\\').replace('"', '\\"')) for k, v in ns.items() if isinstance(v, (str, int, float))]) pid = os.fork() if pid == 0: os.system(env + ';(' + cmd + ')| $py terminate_shell') sys.exit(0) pass server.handle() if inplace: return ''.join(inplace_blks) pass def run(cmd): _run(cmd, inplace=False) pass def runv(cmd): txt = _run(cmd, inplace=True) return txt if __name__ == '__main__': def add_prefix(args, env, session): yield # wait data while True: data = session.recv() if data == None: # no more data break session.send(args[0] + data) yield # wait next data pass session.exit(0) pass for i in range(20): run('echo $i|$py add_prefix "hello: "') pass txt = runv('echo HELLO').strip() print 'inplace value: %s' % (txt) pass