python subprocess在执行时读取stdout

kri*_*itx 4 python linux subprocess

我在程序中的一个函数检查哈希文件的md5sum

def check():
    print "checking integrity status.."
    md5 = subprocess.Popen(["md5sum", "-c", hashfile],shell=False, stdout=subprocess.PIPE)
    #fopen = open(basefile, "r")
    for f in md5.stdout.readlines():
        fc = f.rstrip("\n")
        sys.stdout.write("\rChecking..." + fc)
        sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

现在发生的事情是整个命令首先执行然后使用md5.stdout.readlines从md5进行循环读取,因此它不是动态的,即我执行命令时没有得到输出....有没有办法我可以在命令执行时获得输出...

修复使用glglgl的答案:

def check():
    print "checking integrity status.."
    md5 = subprocess.Popen(["md5sum", "-c", hashfile],shell=False, stdout=subprocess.PIPE)
    #fopen = open(basefile, "r")
    fc = "NULL"
    i = 0
    for f in iter(md5.stdout.readline, ''):
        k = fc
        fc = f.rstrip("\n")
        if "FAILED" in fc:
            print fc
        i = i + 1
        sys.stdout.write("\rChecking... "+ str(i)+ " " + fc + (' ' * (len(k) - len(fc))) )
        sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

glg*_*lgl 5

当然.有几种方法.

  1. 首先,您可以使用md5.stdout.read(),但在那里您必须自己进行线分离.

  2. 然后,您可以将文件对象md5.stdout作为迭代器进行操作.但似乎存在缓冲问题,即您没有立即获得结果.

  3. 然后有可能md5.stdout.readline()反复调用直到它返回''.

在这种情况下,第三种方式是首选; 我建议这样做:

...

for f in iter(md5.stdout.readline, ''):
    fc = f.rstrip("\n")
    sys.stdout.write("\rChecked " + fc)
    sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

我也改变了输出文本,因为只有che检查已经完成才有输出.

如果这不是您想要的,而是真正让每个输出单独捕获,您应该切换到第1点.但这使它更复杂.我会考虑一个解决方案,表明它是需要的.

在那里,必须考虑以下几点:

  • read() 块,所以应该逐字节读取(非常难看).
  • 有一个问题应该输出什么,什么时候应该有间歇输出.