Python 3如何从stdin上的文件生成md5哈希?

Duk*_*gal 1 python string buffer md5

我试图使用Python 3从stdin计算文件的md5哈希

这是返回的错误消息.我不明白为什么它不返回md5哈希.任何帮助赞赏.

$./pymd5.py < tmp.pdf
Traceback (most recent call last):
  File "./pymd5.py", line 29, in <module>
    main()
  File "./pymd5.py", line 25, in main
    print(m.hexdigest())
TypeError: 'str' does not support the buffer interface
$ 
Run Code Online (Sandbox Code Playgroud)

代码:

#!/usr/local/bin/python3.2

import sys
import hashlib

BUFSIZE = 4096

def make_streams_binary():
    sys.stdin  = sys.stdin.detach()
    sys.stdout = sys.stdout.detach()

def main():
    make_streams_binary()
    m = hashlib.md5()
    while True:
        data = sys.stdin.read(BUFSIZE)
        if not data:
            break
        m.update(data)

    print(m.hexdigest())

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

agf*_*agf 5

当你这样做

sys.stdout = sys.stdout.detach()
Run Code Online (Sandbox Code Playgroud)

它取消了print在Python 3上终端正常使用的能力,因为你获得了一个缓冲区而不是一个用于编码和解码的缓冲区.在你之前print,你应该做:

sys.stdout = sys._stdout
Run Code Online (Sandbox Code Playgroud)

要原来的stdout回来.