Как получить стандартный вывод дочернего процесса OF дочернего процесса при его запуске? - PullRequest
1 голос
/ 28 февраля 2020

Я запускаю сценарий python, который запускает сценарий внутри контейнера docker, который распечатывает время его запуска, запускает другой процесс с аргументами, а затем выводит время его окончания после того, как запущенный процесс готово.

Я использую этот код для запуска сценария в контейнере и получения его вывода:

pr = subprocess.Popen('docker exec ' + docker_container + ' /scripts/sct.sh', cwd=os.path.dirname('/'),
                                                shell=True, stdout=subprocess.PIPE, stderr = subprocess.PIPE )
        if debug:
                while True:
                        output = pr.stdout.readline().decode('utf-8')
                        if output == '' and pr.poll() is not None:
                                break
                        if output:
                                print(output.strip())
        else:
                (out, error) = pr.communicate()
                print("### re-index: error message: " + error.decode('utf-8'))
                print("### re-index: message: " + out.decode('utf-8')) 

Когда я запускаю в режиме отладки, я хочу видеть все строк вывода из процесса, запускаемого сценарием внутри контейнера, во время его работы, чтобы я мог видеть, зависает ли он, останавливает ли он работу, корректирует ли он настройки и запускается ли снова, чтобы увидеть, решил ли я что-то.

Проблема в том, что когда я пытаюсь это сделать, я получаю только временную шкалу из скрипта внутри контейнера, на лету. Остальные строки (выходные данные процесса, запускаемого сценарием внутри контейнера) выполняются только после завершения процесса, запускаемого сценарием внутри контейнера, запущенного.

Процесс занимает несколько часов, независимо от того, хорошо он работает или плохо, поэтому просто ждать, пока он завершится sh, а затем проанализировать результаты, не вариант.

Можно ли как-то изменить свой код, чтобы получить выходные данные ОБА моего дочернего процесса (= сценарий внутри контейнера) и его дочерний процесс (= процесс, который он запускает) по мере их запуска, а не после завершения дочернего процесса?

Кроме вырезания посредника и запуска дочернего процесса то есть процесс, который я действительно хотел бы избежать.

...