我正在尝试检查系统中安装的软件的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()表明我在正确的目录中。
有谁知道问题是什么?
答案 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?
或在这里
答案 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'))