我正在尝试使用Paramiko运行远程Python脚本,并使其实时将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上缓冲区的连续/循环命令一起使用。我的问题是,由于某种原因,stdout仅在Python脚本完成运行时才被填充,而Python输出的所有内容仅在脚本完成后才会出现。我希望它在脚本运行时 打印。这是我正在使用的测试脚本:
from time import sleep
print("Test.")
sleep(1)
print("Test again.")
sleep(2)
print("Final test.")
有没有解决的办法,或者我做错了什么?预先感谢。
答案 0 :(得分:0)
问题解决了。该解决方案实际上非常简单。运行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脚本的输出。