view shada/shhelper.py @ 21:86d71eb1c66c

Helper for interactive shell
author Thinker K.F. Li <thinker@codemud.net>
date Thu, 31 Mar 2011 20:46:08 +0800
parents
children 08f19afde7bd
line wrap: on
line source

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