Как правильно закрыть объект подпроцесса, как только мы его закончили?
stdout.close()
и stdin.close()
не завершат процесс , если не завершится самостоятельно в конце ввода или при ошибках записи.
.terminate()
и .kill()
оба выполняют свою работу, при этом kill
немного более "радикально" в системах POSIX при отправке SIGKILL
, что не может быть проигнорировано приложением. Конкретные различия объяснены в этом сообщении в блоге , например. В Windows нет разницы.
Кроме того, не забудьте .wait()
и закрыть трубы после завершения процесса, чтобы избежать зомби и форсировать освобождение ресурсов.
Особый случай, который часто встречается, это процессы, которые читают из STDIN и записывают свой результат в STDOUT, закрывая себя при обнаружении EOF. С такими программами часто целесообразно использовать subprocess.communicate
:
>>> p = Popen(["sort"], stdin=PIPE, stdout=PIPE)
>>> p.communicate("4\n3\n1")
('1\n3\n4\n', None)
>>> p.returncode
0
Это также можно использовать для программ, которые что-то печатают и выходят сразу после:
>>> p = Popen(["ls", "/home/niklas/test"], stdin=PIPE, stdout=PIPE)
>>> p.communicate()
('file1\nfile2\n', None)
>>> p.returncode
0
Учитывая природу моего скрипта, есть ли способ открыть объект подпроцесса только один раз и повторно использовать его с другими командами оболочки? Будет ли это эффективнее, чем каждый раз открывать новые объекты подпроцесса?
Я не думаю, что модуль subprocess
поддерживает это, и я не вижу, какие ресурсы здесь могут быть использованы совместно, поэтому я не думаю, что это даст вам значительное преимущество.