Используйте подпроцесс для проверки md5sum

Я пытаюсь проверить md5sum программного обеспечения, установленного в моей системе. Сначала я объясню среду, а затем объясню проблему. Есть директория / home / software. в этом каталоге есть несколько папок, таких как software1, software2 и так далее. в каждой из этих папок есть папка (скажем, folder1), которая содержит файл проверки * .md5 (check123.md5). Это содержимое этого файла, который я пытаюсь прочитать.

Eg:

>>cd /home/software/software1
>>md5sum -c  folder1/check*.md5

Когда я пробую две указанные выше команды в командной строке Linux, я получаю результат. Пытаюсь написать скрипт на питоне. Итак, изначально я использовал 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 () показал, что я нахожусь в правильном каталоге.

Кто-нибудь знает, в чем проблема?


person HighonH    schedule 24.11.2015    source источник
comment
почему бы не использовать собственные методы md5 в Python? это описано здесь: stackoverflow.com/questions/16874598/   -  person keda    schedule 24.11.2015
comment
stackoverflow.com/a/21565932/5087125 кажется даже лучше, когда кто-то на самом деле сравнивает hashlib с запуском md5sum в подпроцессе. Кажется, это того не стоит, а встроенный способ более портативен для загрузки.   -  person pvg    schedule 24.11.2015


Ответы (2)


* подстановочный знак расширяется оболочкой в ​​POSIX. subprocess.Popen по умолчанию не запускает оболочку.

Нет необходимости запускать оболочку для чтения файлов, соответствующих заданному шаблону файла в 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'))
person jfs    schedule 25.11.2015

Проблема в том, что вы используете подстановочный знак - * в своей команде Popen. Вам нужно использовать shell=True в вашем операторе Popen, чтобы выполнить команду через интерпретатор оболочки и разрешить использование подстановочных знаков.

p1 = subprocess.Popen(vars, stdout = open ("/tmp/test.txt", "a"), shell=True)

Это избавит от ошибки md5sum: folder1/check*.md5: No such file or directory.

Однако я думаю, вам действительно стоит использовать собственные методы Python, описанные здесь.

Как рассчитать контрольную сумму md5 для файл на Python?

или здесь

Создание контрольной суммы файла MD5

person keda    schedule 24.11.2015
comment
Нет, я не пытаюсь вычислить md5-сумму файла. Вместо этого файл .md5 фактически содержит список md5sum всех файлов в своей папке. Я пытаюсь проверить это содержание - person HighonH; 25.11.2015
comment
@HighonH так что прочтите содержимое файла и обработайте его с помощью python. не могли бы вы опубликовать содержимое вашего файла и немного больше о том, что вы пытаетесь сделать? я могу попытаться помочь вам. - person keda; 25.11.2015
comment
@HighonH также, shell=True - это способ исправить вашу текущую проблему. - person keda; 25.11.2015