使用 subprocess 检查 md5sum

Use subprocess to check md5sum

我正在尝试检查我系统中安装的软件的 md5sum。我先说明环境再说明问题。有一个目录 /home/software。在此目录中有多个文件夹,如 software1、software2 等。在这些文件夹中的每一个中都有一个文件夹(比如文件夹 1),其中包含一个检查*.md5 文件(check123.md5)。它是我试图阅读的这个文件的内容。

例如:

>>cd /home/software/software1
>>md5sum -c  folder1/check*.md5

当我在 linux 命令行中尝试以上两个命令时,我得到了输出。 我正在尝试在 python 中编写脚本。所以最初我使用 os.system 并且它再次起作用。但是现在我的要求是我必须使用子流程。但它不再起作用了。

我的代码甚至可以在python命令行中模拟。

 import subprocess, os
 os.chdir(/home/software/software1)
 var = "md5sum -c  folder1/check*.md5"
 vars = shlex.split(var)
 p1 = subprocess.Popen(vars, stdout = open ("/tmp/test.txt", "a"))

输出结果如下:md5sum: folder1/check*.md5: No such file or directory.

现在我意识到只有当我不在正确的目录中时才会出现此错误。但是 os.cwd() 表明我在正确的目录中。

有人知道问题出在哪里吗?

问题是您在 Popen 命令中使用了通配符 - *。您需要在 Popen 语句中使用 shell=True 以通过 shell 解释器执行命令并允许使用通配符。

p1 = subprocess.Popen(vars, stdout = open ("/tmp/test.txt", "a"), shell=True)

这将消除 md5sum: folder1/check*.md5: No such file or directory 错误。

但是,我认为您真的应该使用此处描述的 Python 的本机方法

How do I calculate the md5 checksum of a file in Python?

或此处

Generating an MD5 checksum of a file

* 通配符由 POSIX 上的 shell 扩展。 subprocess.Popen默认不启动shell。

无需启动 shell 即可读取与 Python 中给定文件模式匹配的文件:

#!/usr/bin/env python
from glob import glob

for filename in glob('/home/software/software1/folder1/check*.md5'):
    with open(filename) as file:
        for line in file:
            process(line)

如果您想 运行 一个子进程:

#!/usr/bin/env python
import subprocess
from glob import glob

subprocess.check_call(['md5sum'] + glob('*.md5'))