使用SSH时,仅在终止时显示python脚本的输出?

Iva*_*ski 5 python ssh stdout

我正在运行一个脚本来管理远程(SSH)计算机上的进程.我们称之为five.py

#!/usr/bin/python
import time, subprocess

subprocess.call('echo 0',shell=True)
for i in range(1,5):
   time.sleep(1)
   print(i)
Run Code Online (Sandbox Code Playgroud)

如果我现在跑

ssh user@host five.py
Run Code Online (Sandbox Code Playgroud)

我想看看输出

0
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

逐秒出现在我的标准输出上(就像在本地执行时那样)..会发生什么:我立即从"echo"获得0,其余只在整个程序结束后立即出现.(无法将'five.py'嵌套到bash脚本中;通过'python five.py'调用它;或者使用'print >> sys.stdout,i').

这必须与python写入stdout的方式有关,因为其他程序表现得很正常.一个功能解决方法是

import time, subprocess
import sys

subprocess.call('echo 0',shell=True)
for i in range(1,5):
  time.sleep(1)
  sys.stdout.write(str(i)+'\n')
  sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

但是必须有一个比改变我所有的打印陈述更好的解决方案!

Joh*_*ooy 6

你可以在shebang线上添加-u作为interjay暗示

#!/usr/bin/python -u
Run Code Online (Sandbox Code Playgroud)

您也可以在关闭缓冲或设置为线缓冲的情况下重新打开stdout

import os,sys
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) # no buffering
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 1) # line buffering
Run Code Online (Sandbox Code Playgroud)

通常行缓冲是一个不错的选择