Paramiko с непрерывным стандартным выводом при запуске удаленного скрипта Python - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь запустить удаленный скрипт Python, используя Paramiko, и переслать ему все, что Python выводит обратно клиенту в режиме реального времени (то есть непрерывный стандартный вывод). Я подключаюсь к своему серверу, вызывая мой класс со следующими данными:

class SSH:
    client = None

    def __init__(self, address, username, password):
        self.client = client.SSHClient()
        self.client.set_missing_host_key_policy(client.AutoAddPolicy())
        self.client.connect(address, username=username, password=password, look_for_keys=False)

Затем я отправляю команды на сервер через мою функцию send_command:

def send_command(self, command):
    if(self.client):
        stdin, stdout, stderr = self.client.exec_command(command)
        for i in range(5): # just print 5 bytes
            print(stdout.channel.recv(1))
            time.sleep(0.1)
    else:
        print("Connection not opened.")

Как правило, это будет работать с любой непрерывной / циклической командой, которая заполняет буфер на stdout при его зацикливании. Моя проблема в том, что по какой-то причине стандартный вывод заполняется только после завершения работы скрипта Python, а все, что выводит Python, появляется только ПОСЛЕ завершения скрипта. Я хочу, чтобы он печатал , пока скрипт запущен. Это тестовый скрипт, который я использую:

from time import sleep
print("Test.")
sleep(1)
print("Test again.")
sleep(2)
print("Final test.")

Есть ли способ обойти это или я делаю что-то не так? Заранее спасибо.

1 Ответ

0 голосов
/ 16 ноября 2018

Проблема решена. Решение было на самом деле очень простым. Мне пришлось запросить psuedo-терминал с сервера при запуске скрипта Python (command = 'python3.6 test.py'). Это делается в Paramiko, просто устанавливая флаг get_pty bool на True. См. Ниже (обратите внимание на get_pty в exec_command):

class SSH:
    client = None

    def __init__(self, address, username, password):
        self.client = client.SSHClient()
        self.client.set_missing_host_key_policy(client.AutoAddPolicy())
        self.client.connect(address, username=username, password=password, look_for_keys=False)

    def send_command(self, command):
        if(self.client):
            stdin, stdout, stderr = self.client.exec_command(command, get_pty=True)
            while not stdout.channel.exit_status_ready():
                OUT = stdout.channel.recv(1024)
                print(OUT)
        else:
            print("Connection not opened.")

Теперь я успешно непрерывно печатаю вывод скрипта Python в режиме реального времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...