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 для использования псевдотерминала.