*** subprocess.py Mon Mar 18 01:08:02 2005 --- subprocess.py Sun Jun 26 12:39:48 2005 *************** *** 396,402 **** from win32api import GetCurrentProcess, DuplicateHandle, \ GetModuleFileName, GetVersion from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE ! from win32pipe import CreatePipe from win32process import CreateProcess, STARTUPINFO, \ GetExitCodeProcess, STARTF_USESTDHANDLES, \ STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE --- 396,403 ---- from win32api import GetCurrentProcess, DuplicateHandle, \ GetModuleFileName, GetVersion from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE ! from win32file import ReadFile, WriteFile ! from win32pipe import CreatePipe, PeekNamedPipe from win32process import CreateProcess, STARTUPINFO, \ GetExitCodeProcess, STARTF_USESTDHANDLES, \ STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE *************** *** 647,652 **** --- 648,668 ---- return self._communicate(input) + def recv(self, maxsize=None): + if self.stdin: + if self.universal_newlines: + return self._translate_newlines(self._recv(self.stdout, maxsize)) + return self._recv(self.stdout, maxsize) + return '' + + + def recv_err(self, maxsize=None): + if self.stderr: + if self.universal_newlines: + return self._translate_newlines(self._recv(self.stderr, maxsize)) + return self._recv(self.stderr, maxsize) + return '' + if mswindows: # *************** *** 885,890 **** --- 901,942 ---- self.wait() return (stdout, stderr) + + def send(self, input): + if not self.stdin: + return 0 + + try: + x = msvcrt.get_osfhandle(self.stdin.fileno()) + (errCode, written) = WriteFile(x, input) + except pywintypes.error, e: + errno = e.args[0] + if errno == 109: # other end disconnected + self.stdin.close() + else: + raise + + return written + + + def _recv(self, conn, maxsize): + try: + x = msvcrt.get_osfhandle(conn.fileno()) + (read, nAvail, nMessage) = PeekNamedPipe(x, 0) + if maxsize < nAvail: + nAvail = maxsize + if nAvail > 0: + (errCode, read) = ReadFile(x, nAvail, None) + except pywintypes.error, e: + errno = e.args[0] + if errno == 109: # other end disconnected + conn.close() + else: + raise + + return read + + else: # # POSIX methods *************** *** 1155,1160 **** --- 1207,1237 ---- return (stdout, stderr) + def send(self, input): + if not self.stdin: + return 0 + + if not select.select([], self.stdin, [], 0)[1]: + return 0 + + written = os.write(self.stdin.fileno(), input) + if not written: + self.stdin.close() + + return written + + + def _recv(self, conn, maxsize): + if not select.select([conn], [], [], 0)[0]: + break + + r = os.read(conn.fileno(), maxsize) + if not r: + conn.close() + + return r + + def _demo_posix(): # # Example 1: Simple redirection: Get process list