【问题标题】:Use subprocess to check md5sum使用子进程检查 md5sum
【发布时间】:2016-02-27 09:50:33
【问题描述】:

我正在尝试检查系统中安装的软件的 md5sum。我将首先解释环境,然后再解释问题。有一个目录/home/software。在此目录中有多个文件夹,如 software1、software2 等。在每个文件夹中都有一个文件夹(比如文件夹 1),其中包含一个 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: No such file or directory.

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

有谁知道问题出在哪里?

【问题讨论】:

标签: python subprocess md5sum


【解决方案1】:

* 通配符在 POSIX 上由 shell 扩展。 subprocess.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'))

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不,我不是要计算文件的 md5sum。相反,.md5 文件实际上包含其文件夹中所有文件的 md5sum 列表。我正在尝试检查此内容
    • @HighonH 所以,读取文件的内容并使用 python 处理它。您能否发布文件的内容以及更多关于您要做什么的信息?我可以尽力帮助你。
    • @HighonH 还有,shell=True 是解决您当前问题的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2014-10-19
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多