【问题标题】:printing stdout in realtime from subprocess从子进程实时打印标准输出
【发布时间】:2013-06-30 21:58:10
【问题描述】:

我想打印而不是捕获 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 实时打印文件传输的详细信息,就像从命令行进行 rsync 一样,而不是等待进程完成打印输出。

【问题讨论】:

    标签: python


    【解决方案1】:

    尝试这样做:

    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
    

    【讨论】:

      【解决方案2】:
      import subprocess
      cmd = 'rsync --rsh=ssh -rv thisdir/ servername:folder/'
      subprocess.call(cmd, shell=True)
      

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

      【讨论】:

        猜你喜欢
        • 2013-06-29
        • 2019-02-24
        • 2012-09-29
        • 1970-01-01
        • 2014-04-29
        • 2021-02-06
        • 2019-11-12
        • 2010-12-09
        • 1970-01-01
        相关资源
        最近更新 更多