changeset 2:369dd74706b3

Host a pyshell server for run()
author Thinker K.F. Li <thinker@codemud.net>
date Mon, 28 Mar 2011 22:56:55 +0800
parents 79bbce42690e
children f81d17014d31
files pysh.py
diffstat 1 files changed, 33 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/pysh.py	Mon Mar 28 22:36:29 2011 +0800
+++ b/pysh.py	Mon Mar 28 22:56:55 2011 +0800
@@ -1,15 +1,45 @@
 import sys
 import os
+import comm
 
 def run(cmd):
+    def terminate_shell(args, env, session):
+        yield
+        while True:
+            data = session.recv()
+            if data == None:
+                break
+            yield
+            pass
+        session.exit(0)
+        server.close()
+        pass
+    
     prev_frame = sys._getframe().f_back
     prev_locals = prev_frame.f_locals
     prev_globals = prev_frame.f_globals
 
-    env = ';'.join(['%s="%s"' % (k, v)
-                    for k, v in prev_locals.items()
+    ns = dict(prev_locals)
+    ns['py'] = 'python -m shell_agent'
+    ns['terminate_shell'] = terminate_shell
+    
+    server = comm.server(ns)
+    server.listen()
+
+    server_addr = server.get_addr()
+    ns['PYSHELL_SERVER'] = server_addr
+
+    env = ';'.join(['export %s="%s"' % (k, v)
+                    for k, v in ns.items()
                     if isinstance(v, (str, int, float))])
-    os.system(env + ';' + cmd)
+    env = env + ';py=\"python -m shell_agent\"'
+    
+    pid = os.fork()
+    if pid == 0:
+        os.system(env + ';' + cmd + '; $py terminate_shell')
+        pass
+    
+    server.handle()
     pass
 
 def runv(cmd):