Python: перенаправление подпроцесса Popen stdout в файл журнала

У меня есть процесс python, имеющий объект журнала, настроенный для печати журналов в файле журнала.

Теперь я пытаюсь вызвать scala script через этот python процесс, используя subprocess модуль Python.

subprocess.Popen(scala_run_command, stdout=subprocess.PIPE, shell=True)

Проблема в том, что всякий раз, когда процесс python завершается, он зависает с оболочкой, которая оживает только после явной команды stty sane. Я предполагаю, что это вызвано тем, что scala script выводит в оболочку и, следовательно, оболочка зависает, из-за своего stdout [что-то в его stdout заставляет оболочку терять свою здравомыслие].

По той же причине я хотел попытаться поместить вывод scala run script в мой файл журнала по умолчанию, который, похоже, не выполняется несколькими способами.

Итак, запрос сводится к, как получить вывод stdout команды оболочки, запущенной через модуль subprocess в файле журнала. Даже если есть лучший способ достичь этого, а не subprocess, run, я хотел бы знать идеи.

Текущее состояние кода выглядит следующим образом.

__echo_command = 'echo ":load %s"' 
__spark_console_command = 'spark;' 
def run_scala_script(self, script): 
     echo_command = self.__echo_command % script 
     spark_console_command = self.__spark_console_command 
     echo_result = subprocess.run(echo_command, stdout=subprocess.PIPE, shell=True) 
     result = subprocess.run(spark_console_command, stdout=subprocess.PIPE, shell=True, input=echo_result.stdout) 
     logger.info('Scala script %s completed successfully' % script) 
     logger.info(result.stdout)

Ответ 1

Использование

p = subprocess.Popen(...)

за которым следует

stdout, stderr = p.communicate()

а затем stdout и stderr будут содержать выходные байты из выходных потоков подпроцесса. Затем вы можете записать значение stdout.