使用 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'))
我正在尝试检查我系统中安装的软件的 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'))