Правильный способ повторного использования и закрытия объекта подпроцесса

У меня есть следующий код в цикле:

while true:
    # Define shell_command
    p1 = Popen(shell_command, shell=shell_type, stdout=PIPE, stderr=PIPE, preexec_fn=os.setsid)
    result = p1.stdout.read(); 
    # Define condition
    if condition:
       break;

где shell_command что-то вроде ls (он просто что-то печатает).

Я читал в разных местах, что могу закрыть/завершить/выйти из объекта Popen различными способами, например:

p1.stdout.close()
p1.stdin.close()
p1.terminate
p1.kill

Мой вопрос:

  1. Как правильно закрыть объект подпроцесса после того, как мы закончим его использовать?
  2. Учитывая природу моего скрипта, есть ли способ открыть только объект подпроцесса? один раз и повторно использовать его с другими командами оболочки? Будет ли это более эффективным, чем каждый раз открывать новые объекты подпроцесса?

Обновление

Я все еще немного не понимаю последовательность шагов для следуй за отцом заканчивая тем, использую ли я p1.communicate() или p1.stdout.read() для взаимодействия с моим процессом.

Из того, что я понял из ответов и комментариев:

Если я использую p1.communicate(), мне не нужно беспокоиться об освобождении ресурсов, поскольку communicate() будет ждать, пока процесс завершится, захватит вывод и правильно закроет объект подпроцесса

, если я буду следовать p1.stdout.маршрут read() (который, я думаю, подходит для моей ситуации, поскольку команда оболочки просто должна печатать материал) Я должен вызывать вещи в следующем порядке:

  1. p1.wait()
  2. p1.stdout.read ()
  3. p1.terminate()

Правильно?

5
задан Amelio Vazquez-Reina 6 March 2012 в 15:37
поделиться