使用子进程检查md5sum

时间:2015-11-24 19:41:33

标签: python subprocess md5sum

我正在尝试检查系统中安装的软件的md5sum。我将首先解释环境,然后我将解释这个问题。有一个目录/家庭/软件。在这个目录中有多个文件夹,如software1,software2等。在每个文件夹中都有一个文件夹(比如folder1),其中包含一个check * .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:没有这样的文件或目录。

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

有谁知道问题是什么?

2 个答案:

答案 0 :(得分:1)

问题是您在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

答案 1 :(得分:0)

*通配符由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'))