python子进程在执行时读取stdout

2024-09-19 14:21:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在程序中的一个函数检查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的循环读取。标准输出读取线,因此它不是动态的,也就是说,当命令执行时,我不能得到输出……有没有一种方法可以在命令执行时获得输出。。。在

使用glglglglgl的答案修复:

^{pr2}$

Tags: 函数命令程序defcheckstdoutsysmd5
3条回答

最初的海报是正确的,hashlib在python2.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)

当然。有几种方法。在

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

  2. 然后,可以将file对象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()

我还更改了输出文本,因为只有che che检查已经完成时才会有输出。在

如果这不是您想要的,而是将每个输出单独捕获,那么您应该切换到第1点。但这就更复杂了。我会考虑一个解决方案,只要表明它是需要的。在

在这方面,必须考虑以下几点:

  • read()块,因此应该逐字节读取(相当难看)。在
  • 问题是什么应该输出,什么时候应该有间歇输出。在

相关问题 更多 >