Вы можете сделать это очень легко в Twisted . В зависимости от существующей кодовой базы, это может быть не так просто использовать, но если вы создаете искаженное приложение, такие вещи становятся почти тривиальными. Вы создаете класс ProcessProtocol
и переопределяете метод outReceived()
. Twisted (в зависимости от используемого реактора) обычно представляет собой большой цикл select()
с обратными вызовами, установленными для обработки данных из различных файловых дескрипторов (часто сетевых сокетов). Таким образом, метод outReceived()
- это просто установка обратного вызова для обработки данных, поступающих из STDOUT
. Простой пример, демонстрирующий это поведение, выглядит следующим образом:
from twisted.internet import protocol, reactor
class MyProcessProtocol(protocol.ProcessProtocol):
def outReceived(self, data):
print data
proc = MyProcessProtocol()
reactor.spawnProcess(proc, './myprogram', ['./myprogram', 'arg1', 'arg2', 'arg3'])
reactor.run()
Документация Twisted содержит полезную информацию по этому вопросу.
Если вы строите все свое приложение на Twisted, оно делает асинхронную связь с другими процессами, локальными или удаленными, действительно элегантной, как это. С другой стороны, если ваша программа построена не на Twisted, это не очень полезно. Надеемся, что это может быть полезно для других читателей, даже если это не применимо для вашего конкретного приложения.