У меня есть следующий код в цикле:
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
Мой вопрос:
подпроцесса
после того, как мы закончим его использовать? подпроцесса
? один раз и повторно использовать его с другими командами оболочки? Будет ли это более эффективным, чем каждый раз открывать новые объекты подпроцесса
?Я все еще немного не понимаю последовательность шагов для следуй за отцом заканчивая тем, использую ли я p1.communicate()
или p1.stdout.read()
для взаимодействия с моим процессом.
Из того, что я понял из ответов и комментариев:
Если я использую p1.communicate()
, мне не нужно беспокоиться об освобождении ресурсов, поскольку communicate()
будет ждать, пока процесс завершится, захватит вывод и правильно закроет объект подпроцесса
, если я буду следовать p1.stdout.маршрут read()
(который, я думаю, подходит для моей ситуации, поскольку команда оболочки просто должна печатать материал) Я должен вызывать вещи в следующем порядке:
p1.wait()
p1.stdout.read ()
p1.terminate()
Правильно?