Как я могу взаимодействовать с командной строкой из python

#python #python-3.x #command-line #windows-10 #powershell-2.0

#python #python-3.x #командная строка #windows-10 #powershell-2.0

Вопрос:

Я пишу очень короткую программу для проверки сумм MD5 на безопасность файлов

Я хотел бы получить путь к файлу от пользователя и ожидаемый результат от контрольной суммы из команды «CertUtil -hashfile MD5», где будет путь к файлу, введенный пользователем, затем я хотел бы получить вывод командной строки в виде строки для сравнения с ожидаемым результатом, которыйпользователь указал. Возможно ли это? Если да, то как я могу изменить приведенный ниже код, чтобы разрешить отправку пути к файлу в качестве переменной и получать выходные данные из командной строки?

Я пишу на 64-битном python 3.9.0 в Windows 10 и хотел бы избежать установки и дополнительных библиотек, если это не является абсолютно необходимым

»’

 #CheckSumChecker! By Joseph
import os
#User file input
data = input("Paste Filepath Here: ")
correct_sum = ("Paste the expected output here: ")
#File hash is checked using cmd "cmd /k "CertUtil -hashfile filepath MD5"
os.system('cmd /k "CertUtil -hashfile C:Windowslsasetup.log MD5"')
if correct_sum == cmd_output:
    print("The sums match!" correct_sum "=" cmd_output)
else:
    print("The sums don't match! Check that your inputs were correct" correct_sum "is not equal to" cmd_output)
  

»’

Комментарии:

1. Не могли бы вы рассказать нам, что вы пробовали и в чем ошибка, если она есть?

Ответ №1:

Вы можете использовать subprocess.check_output . (В вашем коде были некоторые другие ошибки, которые я исправил здесь.)

 import subprocess

input_path = input("Paste Filepath Here: ")
correct_sum = input("Paste the expected output here: ")
output = (
    subprocess.check_output(
        ["CertUtil", "-hashfile", input_path, "MD5",]
    )
    .decode()
    .strip()
)
print("Result:", output)
if correct_sum == output:
    print("The sums match!", correct_sum, "=", cmd_output)
else:
    print(
        "The sums don't match! Check that your inputs were correct",
        correct_sum,
        "is not equal to",
        cmd_output,
    )
  

Или, чтобы вообще не использовать CertUtil, используйте встроенный hashlib модуль.

Вам нужно будет проявить некоторую осторожность, чтобы не читать весь файл в память сразу…

 import hashlib
input_path = input("Paste Filepath Here: ")
correct_sum = input("Paste the expected output here: ")

hasher = hashlib.md5()
with open(input_path, "rb") as f:
    while True:
        chunk = f.read(524288)
        if not chunk:
            break
        hasher.update(chunk)
output = hasher.hexdigest()
print("Result:", output)
if correct_sum == output:
    print("The sums match!", correct_sum, "=", cmd_output)
else:
    print(
        "The sums don't match! Check that your inputs were correct",
        correct_sum,
        "is not equal to",
        cmd_output,
    )