使用Python Paramiko exec_命令执行时,命令不会完成

使用Python Paramiko exec_命令执行时,命令不会完成,python,python-3.x,ssh,callback,paramiko,Python,Python 3.x,Ssh,Callback,Paramiko,我有一个Python程序,它位于远程服务器上,在运行时将文件上传到AWS bucket。如果我ssh到服务器上,并使用命令sudopython3/path/to/backup.py运行它,它会正常工作 我正在编写一个Python程序来自动化一个更大的过程,包括运行backup.py。我使用paramiko库创建了一个函数来实现这一点。这是命令运行的地方 ssh\u stdin,ssh\u stdout,ssh\u stderr=self.ssh.exec\u命令('sudo python3/pa

我有一个Python程序,它位于远程服务器上,在运行时将文件上传到AWS bucket。如果我ssh到服务器上,并使用命令
sudopython3/path/to/backup.py
运行它,它会正常工作

我正在编写一个Python程序来自动化一个更大的过程,包括运行backup.py。我使用paramiko库创建了一个函数来实现这一点。这是命令运行的地方

ssh\u stdin,ssh\u stdout,ssh\u stderr=self.ssh.exec\u命令('sudo python3/path/to/backup.py',1800)
debug(f'ssh\u stdout:{ssh\u stdout.readline()})
debug(f'ssh_stderr:{ssh_stderr.readline()}')
我的自动化为我提供了以下输出:

ssh_stdout:Tue,2020年5月19日14:36:43信息COS端点是9.11.200.206,正在写入vault:SD_BACKUP_4058
程序在那之后什么也不做。当我登录到服务器并检查
backup.py
的日志时,我可以看到它仍在运行,似乎正在上传文件。这就是它被卡住的代码:

s3\u client.upload\u文件(
Filename=备份,
Bucket=Bucket\u名称,
Key=SPLIT\u文件名,
回调=pp(备份),
Config=Config)

我不明白为什么当我的自动化程序启动时,它会卡在这里,而不是当我从终端的命令行运行它时。我在日志中看不到任何对我有帮助的东西。它似乎只是停留在执行的那个点上。这可能与回调没有返回有关吗?

您只读取了一行输出

logging.debug(f'ssh_stdout: {ssh_stdout.readline()}')
如果远程程序产生大量输出,一旦其输出缓冲区填满,该程序将挂起下一次写入某些输出的尝试


如果你想让程序完成,你必须继续读取输出

logging.debug(f'ssh_stdout: {ssh_stdout.readline()}')
最简单的方法是使用
readlines
read

print(stdout.read())
但对于像您这样的大型输出来说,这是低效的

相反,您可以逐行读取输出:

for line in stdout:
    print(line.strip())

当命令同时产生一个错误输出时,它变得更加复杂,因为您必须读取两个输出流。 看