Python: когда использовать pty.fork() против os.fork()
Я не знаю, использовать ли pty.fork()
или os.fork()
при нерестах внешних фоновых процессов из моего приложения. (Например, шахматные двигатели)
Я хочу, чтобы порожденные процессы умирали, если родитель был убит, как при нерестах приложений в терминале.
Каковы взлеты и падения между двумя вилами?
Ответы
Ответ 1
Детский процесс, созданный с помощью os.fork()
, наследует stdin/stdout/stderr от родительского процесса, а дочерний элемент, созданный с помощью pty.fork()
, подключается к новому псевдотерминалу. Вам понадобится более поздняя версия, когда вы пишете программу типа xterm: pty.fork()
в родительском процессе возвращает дескриптор для управления терминалом дочернего процесса, чтобы вы могли визуально представлять данные из него и транслировать действия пользователя в последовательности ввода терминалов.
Update:
Из справочной страницы pty (7):
Процесс, который ожидает подключения к терминалу, может открывать ведомый конец псевдотерминала, а затем управляемый программой, которая открыл главный конец. Все, что написано на главном конце предоставляемый процессу на подчиненном конец, как если бы он был введен терминал. Например, символ прерывания (обычно control-C) к ведущему устройству приведет к сигналу прерывания (SIGINT) для генерации группа процессов переднего плана, которая подключен к ведомому. Наоборот, все, что написано на ведомый конец псевдотерминала может быть прочитанным процессом, который подключен к главному концу.
Ответ 2
В прошлом я всегда использовал модуль subprocess
для этого. Он обеспечивает хороший api для связи с подпроцессами.
Вы можете использовать call(*popenargs, **kwargs)
для блокировки их выполнения, и я считаю, что использование класса Popen
может обрабатывать выполнение async.
Подробнее о docs.
Что касается использования os.fork
vs pty.fork
, то оба они зависят от платформы, и ни один из них не будет работать (или, по крайней мере, проверен) с окнами. Модуль pty
кажется более ограниченным из двух, читая документы. Основное различие заключается в аспекте псевдотерминала. Поэтому, если вы не желаете архивировать свой код таким образом, чтобы иметь возможность использовать модуль subprocess
, я бы, вероятно, пошел с os.fork
вместо pty.fork
.
Ответ 3
Псевдотермиалы необходимы для некоторых приложений, которые действительно ожидают терминала. Интерактивная оболочка - один из этих примеров, но есть много других. Опция pty.fork не существует в качестве другого os.fork, а как конкретный API для использования псевдотерминала.