Python: когда использовать pty.fork () против os.fork () - PullRequest
14 голосов
/ 17 декабря 2009

Я не уверен, использовать ли pty.fork() или os.fork() при порождении внешних фоновых процессов из моего приложения. (Например, шахматные движки)

Я хочу, чтобы порожденные процессы умирали, если родитель был убит, как в случае с порождающими приложениями в терминале.

Каковы взлеты и падения между двумя вилками?

Ответы [ 3 ]

10 голосов
/ 17 декабря 2009

Дочерний процесс, созданный с помощью os.fork(), наследует stdin / stdout / stderr от родительского процесса, в то время как дочерний процесс, созданный с помощью pty.fork(), подключается к новому псевдотерминалу. Позднее вам понадобится, когда вы пишете программу, подобную xterm: pty.fork(), в родительском процессе возвращает дескриптор для управления терминалом дочернего процесса, поэтому вы можете визуально представлять данные из него и переводить действия пользователя в последовательности ввода терминала.

Обновление:

Из справочной страницы pty (7):

Процесс, который ожидает подключения к терминалу, может открыть подчиненный конец псевдо-терминала, а затем быть движимый программой, которая имеет открыл мастер-конец. Все, что написано на мастер-конце предоставлен процесс на раб конец, как если бы он был введен на терминал. Например, написание символ прерывания (обычно control-C) к ведущему устройству вызовет сигнал прерывания (SIGINT), который будет создан для группа процессов переднего плана, которая подключен к рабу. Наоборот, все, что написано в подчиненный конец псевдотерминала может быть прочитанным процессом, который подключен к основному концу.

4 голосов
/ 17 декабря 2009

В прошлом я всегда использовал для этого модуль subprocess. Он предоставляет хороший API для связи с подпроцессами.

Вы можете использовать call(*popenargs, **kwargs) для блокировки их выполнения, и я считаю, что использование класса Popen может обрабатывать асинхронное выполнение.

Проверьте документы для получения дополнительной информации.

Что касается использования os.fork против pty.fork, то оба сильно зависят от платформы, и ни один из них не будет работать (или, по крайней мере, проверен) с окнами. Модуль pty кажется более ограниченным из-за чтения документов. Основным отличием является аспект псевдотерминала. Поэтому, если вы не хотите создавать свой код таким образом, чтобы можно было использовать модуль subprocess, я бы, вероятно, выбрал os.fork вместо pty.fork.

2 голосов
/ 04 августа 2012

Псевдотермиалы ​​необходимы для некоторых приложений, которые действительно ожидают терминала. Интерактивная оболочка - один из этих примеров, но есть много других. Опция pty.fork присутствует не как другой os.fork, а как специальный API для использования псевдотерминала.

...