Я работаю, чтобы запустить длительный процесс на сервере (удаленном компьютере) из процесса Python на моем компьютере (локальном компьютере).
Я могу запустить и успешно выполнить процесс, используя функцию exec_command
от Paramiko, и она прекрасно работает. Однако код, который я выполняю на удаленной машине, является длительным процессом, и я хочу выполнить некоторые проверки в выводе / журнале. То есть я хочу прочитать вывод во время его работы и проверить наличие определенных ключевых слов в выводе.
Я собрал минимальный рабочий пример, чтобы проиллюстрировать это. Вместо того, чтобы проверять определенные ключевые слова, я печатаю вывод на экран.
Когда я запускаю следующее, я получаю все выходные вместе после завершения процесса. Я не могу получить выходные данные, когда они печатаются удаленным процессом.
Я даже пытался использовать setblocking
и settimeout
безрезультатно.
У меня есть следующий файл, который я запускаю со своего ноутбука.
import sys
import paramiko
import os
import select
import getpass
import time
rpi = {
"username": getpass.getuser(),
"hostname": "hostname.of.server.here"
}
command = "cd /path/to/folder/ && python test_worker.py"
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(**rpi)
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(command)
def worker(stdout, stderr):
# Wait for the command to terminate
print("Status of worker is {}".format(stdout.channel.exit_status_ready()))
while not stdout.channel.exit_status_ready():
time.sleep(1)
print("Status of worker is {}".format(stdout.channel.exit_status_ready()))
if stdout.channel.recv_ready():
# Only print data if there is data to read in the channel
print("Worker stdout.channel.recv_ready: {}".format(stdout.channel.recv_ready()))
rl, wl, xl = select.select([stdout.channel], [], [], 0.0)
if len(rl) > 0:
# Print data from stdout
print("Output: {}".format(stdout.channel.recv(1024).decode("utf-8")))
print("Reading output from master")
worker(ssh_stdout, ssh_stderr)
print("Finished reading output from master")
Файл test_worker.py выглядит следующим образом:
import time
import sys
i = 0
while True:
time.sleep(5)
i = i + 5
print("At time {}".format(i))
if i > 15:
sys.exit(0)
Это вывод, который я получаю в данный момент,
$ python paramiko_runner.py
Reading output from master
Worker function printer
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is False
Status of worker is True
Worker stdout.channel.recv_ready: True
Output: At time 5
At time 10
At time 15
At time 20
Finished reading output from master