从子进程实时打印stdout

时间:2013-06-30 21:58:11

标签: python

我想打印而不是捕获bash命令的输出(比this post更接近实时)。例如,我有一个这样的脚本:

from subprocess import Popen, PIPE, STDOUT
cmd = 'rsync --rsh=ssh -rv thisdir/ servername:folder/'
p = Popen(cmd.split() ,stdout=PIPE, stderr=STDOUT)
output = p.communicate()[0]
print output

我希望从rsync实时打印文件传输的详细信息,就好像从命令行进行rsyncing,而不是等待进程完成打印输出。

2 个答案:

答案 0 :(得分:4)

尝试这样做:

from subprocess import Popen, PIPE, STDOUT
cmd = 'rsync --rsh=ssh -rv thisdir/ servername:folder/'
p = Popen(cmd.split(), stdout=PIPE, stderr=STDOUT)
for line in p.stdout:
    print line

注意,p.stdout有硬编码缓冲区(8192 bytes),如果你想立刻开始阅读文件,试试这个:

for line in iter(p.stdout.readline,''):
    print line

答案 1 :(得分:1)

import subprocess
cmd = 'rsync --rsh=ssh -rv thisdir/ servername:folder/'
subprocess.call(cmd, shell=True)

shell=True参数通过将字符串传递给sh来解释字符串,允许sh将字符串拆分为标记。)