subprocess.Popen ест память, находясь в цикле

Я написал скрипт на python, чтобы помочь мне автоматизировать проект, над которым я работаю. Он выполняет подпроцесс Capstone в цикле, так как я не смог получить привязку для установки в то время, считывая 4 байта из двоичного файла и передавая его как входные данные Capstone.

Проблема в том, что у меня было более 30 МБ двоичных данных, из-за чего этот сценарий продолжался некоторое время. Поэтому я оставил это на несколько минут, и когда я вернулся, использование моей оперативной памяти составило 98%.

Я перешел к использованию привязки Capstone, но мне любопытно, что здесь пошло не так. Мой код ниже. Спасибо!

import binascii
import subprocess
import sys

def main():
    if len(sys.argv) != 3:
        print(sys.argv[0] + " [binary file] [output file]")
        sys.exit(1)
    hexdata = ""
    f = open(sys.argv[1], "rb")
    if f == None:
        print("Could not open file!")
        sys.exit(1)
    data = f.read()
    f.close()
    x = 0
    out = open(sys.argv[2], "a+")
    while x < len(data):
        for y in xrange(4):
            hexdata += binascii.hexlify(data[x])
            x += 1
        popen = subprocess.Popen(["cstool", "arm64", hexdata], stdout=subprocess.PIPE, universal_newlines=True)
        for line in iter(popen.stdout.readline, ""):
            out.write(line.rstrip()[13:])
        popen.stdout.close()
        hexdata = ""
    out.close()

if __name__ == "__main__":
    main()

РЕДАКТИРОВАТЬ: Исправлен код. Я написал это обратно по памяти, поэтому я все испортил.

1 ответ

Решение

Вы забыли добавить popen.kill() или же popen.terminate() убить / завершить процесс после его запуска снова и снова.

Добавление popen.kill() или же popen.terminate() внутри while в конце следует убить оставшийся процесс.

Другие вопросы по тегам