У меня есть скрипт, который является частью автоматизированного набора тестов.Он работает очень медленно в Windows, но не в Linux, и я выяснил, почему.Процесс, который мы тестируем («откровенный»), создает дочерний процесс (то есть внука).Код Python не вернется, пока этот процесс внука также не закончится (в Windows - не делает этого в Linux).Процесс внука убьет себя через 5 секунд, если нет родителя (он зависает в случае, если с ним разговаривает другой процесс)
Я обнаружил, что могу прекратить зависание функции связи таким образом, если яне захватывать стандартный выводНо мне нужен стандартный вывод.Я где-то читал, что функция связи ожидает закрытия всех каналов.Я знаю, что дескриптор stdout дублирован для внука, но я не могу изменить код, который я тестирую.
Я искал решение.Я попробовал некоторые флаги создания (все еще в коде), но это не помогло.
Это сокращенный тест -
import os
import sys
import threading
import subprocess
def read_from_pipe(process):
last_stdout = process.communicate()[0]
print (last_stdout)
CREATE_NEW_PROCESS_GROUP = 0x00000200
DETACHED_PROCESS = 0x00000008
# start process
command = 'frank my arguments'
cwd = "C:\\dev\\ui_test\\frank_test\\workspace\\report183"
p = subprocess.Popen(command,
stdout=subprocess.PIPE,
cwd=cwd)
# run thread to read from output
t = threading.Thread(target=read_from_pipe, args=[p])
t.start()
t.join(30)
print('finished')
Есть идеи?
Спасибо.
Питер.