pythonsubprocess在执行时读取stdout

我的一个函数在程序中检查hashfile的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() 

现在发生了什么是整个命令是第一次执行,然后从md5循环读取使用md5.stdout.readlines,因此它不是dynamic的,即我没有得到输出作为命令执行….有没有办法我可以得到输出,而命令正在执行中…

使用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() 

当然。 有几种方法。

  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() 

我也改变了输出文本,因为如果已经完成了检查,那么只有一个输出。

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

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

  • read()块,所以应该读取字节的字节(相当丑陋)。
  • 有什么应该输出的问题,什么时候应该有一个间歇输出。

原来的海报是正确的,hashlib在Python 2.4中不可用,但是,md5库是可用的。 示例解决方法:

 try: # Python 2.5 and up. import hashlib md5Hash = hashlib.md5 except ImportError: # Python 2.4 and below. import md5 md5Hash = md5.new somedata = 'foobar' hashstring = md5Hash (somedata).hexdigest () 

什么是文件大小?

Popen创建一个新的子进程来运行该命令。 也许它在你运行for循环之前完成。

您可以检查“subprocess”是否已经完成寻找returncode属性(在您的代码:md5.returncode)