@@ -359,25 +359,50 @@ def get_content(header=None):
359
359
is_timeout = False
360
360
361
361
if WIN :
362
- start_time = time .time ()
362
+ start_time = [ time .time ()]
363
363
was_timeout = [False ]
364
364
365
+ def stdout_reader_run ():
366
+ while True :
367
+ c = proc .stdout .read (1 )
368
+ if not c :
369
+ break
370
+ start_time [0 ] = time .time ()
371
+ stdout_chunks .append (c )
372
+
373
+ def stderr_reader_run ():
374
+ while True :
375
+ c = proc .stderr .read (1 )
376
+ if not c :
377
+ break
378
+ start_time [0 ] = time .time ()
379
+ stderr_chunks .append (c )
380
+
365
381
def watcher_run ():
366
382
while proc .returncode is None :
367
383
time .sleep (0.1 )
368
- if time .time () - start_time > timeout :
384
+ if time .time () - start_time [ 0 ] > timeout :
369
385
was_timeout [0 ] = True
370
386
proc .terminate ()
371
387
372
388
watcher = threading .Thread (target = watcher_run )
373
389
watcher .start ()
390
+
391
+ stdout_reader = threading .Thread (target = stdout_reader_run )
392
+ stdout_reader .start ()
393
+
394
+ stderr_reader = threading .Thread (target = stderr_reader_run )
395
+ stderr_reader .start ()
396
+
374
397
try :
375
- stdout , stderr = proc .communicate ()
398
+ proc .wait ()
376
399
finally :
377
400
if proc .returncode is None :
378
401
proc .terminate ()
379
402
proc .wait ()
380
403
watcher .join ()
404
+ stderr_reader .join ()
405
+ stdout_reader .join ()
381
406
382
407
is_timeout = was_timeout [0 ]
383
408
else :
@@ -450,8 +475,9 @@ def sig_forward(signum, frame):
450
475
451
476
stdout_chunks .append (proc .stdout .read ())
452
477
stderr_chunks .append (proc .stderr .read ())
453
- stdout = b'' .join (stdout_chunks )
454
- stderr = b'' .join (stderr_chunks )
478
+
479
+ stdout = b'' .join (stdout_chunks )
480
+ stderr = b'' .join (stderr_chunks )
455
481
456
482
stdout = stdout .decode ('utf-8' , 'replace' )
457
483
stderr = stderr .decode ('utf-8' , 'replace' )
0 commit comments