Python 使用子流程检查md5sum

Python 使用子流程检查md5sum,python,subprocess,md5sum,Python,Subprocess,Md5sum,我正在尝试检查系统中安装的软件的md5sum。我会先解释环境,然后再解释问题。有一个目录/home/software。在此目录中有多个文件夹,如software1、software2等。在每个文件夹中都有一个文件夹(比如folder1),其中包含一个check*.md5文件(check123.md5)。我正试图阅读的是这个文件的内容 例如: 当我在linux命令行中尝试上述两个命令时,我得到了输出。 我正在尝试用python编写一个脚本。所以,最初我使用os.system,然后它又开始工作了。但

我正在尝试检查系统中安装的软件的md5sum。我会先解释环境,然后再解释问题。有一个目录/home/software。在此目录中有多个文件夹,如software1、software2等。在每个文件夹中都有一个文件夹(比如folder1),其中包含一个check*.md5文件(check123.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()显示我在正确的目录中


有人知道问题是什么吗?

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

p1 = subprocess.Popen(vars, stdout = open ("/tmp/test.txt", "a"), shell=True)
这将消除
md5sum:folder1/check*.md5:No这样的文件或目录
错误

然而,我认为您应该真正使用这里描述的Python本机方法

还是在这里


*
通配符由POSIX上的shell扩展<代码>子进程。默认情况下,Popen不会启动shell

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

#!/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'))

为什么不使用python的原生md5方法呢?这里描述了这一点:似乎更好,在这一点上,有人实际上对hashlib进行了基准测试,以防在子流程中运行md5sum。这似乎不值得,而且内置方式更便于引导。不,我不想计算文件的md5sum。相反,.md5文件实际上包含其文件夹中所有文件的md5sum列表。我正在检查这个content@HighonH因此,读取文件的内容并使用python进行处理。你能不能把文件的内容和你想做的事情再多贴一点?我可以试着帮你。@HighonH还有,
shell=True
是解决当前问题的方法。
#!/usr/bin/env python
import subprocess
from glob import glob

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