changeset 21:86d71eb1c66c

Helper for interactive shell
author Thinker K.F. Li <thinker@codemud.net>
date Thu, 31 Mar 2011 20:46:08 +0800
parents 82acaafa57f9
children 08f19afde7bd
files shada/shhelper.py
diffstat 1 files changed, 54 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/shada/shhelper.py	Thu Mar 31 20:46:08 2011 +0800
@@ -0,0 +1,54 @@
+from shada import comm
+
+def def_cmd(args, env, session):
+    pass
+
+def cmds(args, env, session):
+    all_cmds = [k for k, v in ns.items() if callable(v)]
+    txt = '\n'.join(all_cmds) + '\n'
+    session.send(txt)
+    pass
+
+def values(args, env, session):
+    all_values = ['%s=%s' % (k, repr(v))
+                  for k, v in ns.items() if not callable(v)]
+    txt = '\n'.join(all_values) + '\n'
+    session.send(txt)
+    pass
+
+def set(args, env, session):
+    if len(args) == 0:
+        return
+    
+    if len(args) == 1:
+        varname = args[0]
+        del ns[varname]
+        return
+    
+    varname = args[0]
+    value = ' '.join(args[1:])
+    ns[varname] = value
+    pass
+
+if __name__ == '__main__':
+    import os
+    
+    ns = {'def': def_cmd, 'cmds': cmds, 'values': values, 'set': set}
+    server = comm.server(ns)
+    server.listen()
+    ns['server'] = server
+    
+    pid = os.fork()
+    if pid == 0:                # child
+        import sys, os
+        sys.stdout.close()
+        sys.stdin.close()
+        os.close(0)
+        os.close(1)
+        os.setpgid(os.getpid(), os.getpid())
+        server.handle()
+    else:
+        addr = server.get_addr()
+        print 'PYSHELL_SERVER="%s"; export PYSHELL_SERVER; py="python -m shada.shell_agent"; export py' % (addr)
+        pass
+    pass