Абсолютно.Как уже отмечалось в комментарии, вы можете сделать это, подключившись к SSH-серверу напрямую с помощью библиотеки Twisted "conch" .Это более масштабируемый (вы можете открыть много соединений без каких-либо дополнительных процессов) и более переносимый (он может работать в Windows), но он не будет учитывать вашу конфигурацию OpenSSH, и вам придется написать кучу дополнительного кода для решенияс такими вещами, как проверка ключа хоста.Другой вопрос также напрямую не касается вашего основного вопроса, который касается обработки выходных данных по мере их поступления.
Простой ответ «да», но вот демонстрационная программа, которая порождает несколько подпроцессов ипоказывает их вывод, как он идет.Вы можете заменить sys.executable
другой программой для запуска (например, ssh
), и она будет работать точно так же.
import os, sys
from twisted.internet.protocol import ProcessProtocol
from twisted.internet import reactor
from twisted.internet.defer import Deferred, gatherResults
script = """
import time
for x in range(3):
time.sleep(1)
print(x)
"""
class SimpleProcess(ProcessProtocol):
def __init__(self, id, d):
self.id = id
self.d = d
def outReceived(self, out):
print('Received output: {out} from: {proc}'
.format(out=repr(out), proc=self.id))
def processEnded(self, reason):
self.d.callback(None)
ds = []
for x in range(3):
d = Deferred()
reactor.callLater(
x * 0.5, reactor.spawnProcess, SimpleProcess(x, d),
sys.executable, [sys.executable, '-u', '-c', script],
os.environ)
ds.append(d)
gatherResults(ds).addBoth(lambda ignored: reactor.stop())
reactor.run()