##// END OF EJS Templates
Try to avoid blocking in read().
Itamar Turner-Trauring -
Show More
@@ -23,6 +23,7 b' import time'
23 from ctypes import c_int, POINTER
23 from ctypes import c_int, POINTER
24 from ctypes.wintypes import LPCWSTR, HLOCAL
24 from ctypes.wintypes import LPCWSTR, HLOCAL
25 from subprocess import STDOUT, TimeoutExpired
25 from subprocess import STDOUT, TimeoutExpired
26 from threading import Thread
26
27
27 # our own imports
28 # our own imports
28 from ._process_common import read_no_interrupt, process_handler, arg_split as py_arg_split
29 from ._process_common import read_no_interrupt, process_handler, arg_split as py_arg_split
@@ -94,20 +95,25 b' def _find_cmd(cmd):'
94 def _system_body(p):
95 def _system_body(p):
95 """Callback for _system."""
96 """Callback for _system."""
96 enc = DEFAULT_ENCODING
97 enc = DEFAULT_ENCODING
97 print("READING...")
98
99 def stdout_read():
98 for line in read_no_interrupt(p.stdout).splitlines():
100 for line in read_no_interrupt(p.stdout).splitlines():
99 line = line.decode(enc, 'replace')
101 line = line.decode(enc, 'replace')
100 print(line, file=sys.stdout)
102 print(line, file=sys.stdout)
103
104 def stderr_read():
101 for line in read_no_interrupt(p.stderr).splitlines():
105 for line in read_no_interrupt(p.stderr).splitlines():
102 line = line.decode(enc, 'replace')
106 line = line.decode(enc, 'replace')
103 print(line, file=sys.stderr)
107 print(line, file=sys.stderr)
104
108
109 Thread(target=stdout_read).start()
110 Thread(target=stderr_read).start()
111
105 # Wait to finish for returncode. Unfortunately, Python has a bug where
112 # Wait to finish for returncode. Unfortunately, Python has a bug where
106 # wait() isn't interruptible (https://bugs.python.org/issue28168) so poll in
113 # wait() isn't interruptible (https://bugs.python.org/issue28168) so poll in
107 # a loop instead of just doing `return p.wait()`.
114 # a loop instead of just doing `return p.wait()`.
108 while True:
115 while True:
109 result = p.poll()
116 result = p.poll()
110 print("POLLED")
111 if result is None:
117 if result is None:
112 time.sleep(0.01)
118 time.sleep(0.01)
113 else:
119 else:
General Comments 0
You need to be logged in to leave comments. Login now