Предотвратить тупик подпроцесса при записи большого stderr в файл - PullRequest
0 голосов
/ 26 февраля 2019

Я конвертирую .zip файлы в XML с subprocess.call.Я также записываю стандартную ошибку для каждого процесса, передавая дескриптор открытого файла аргументу stderr.

ПРОБЛЕМА: иногда преобразование выдает огромное количество ошибок и процесс блокируется.Монитор активности показывает процесс зависания с 8 ГБ памяти.

def convert(directory): 
    submissions = get_submissions_to_convert(directory)
    for submission in submissions:
        outpath = get_outpath(submission)
        submission_id = os.path.splitext(os.path.basename(outpath))[0]
        logfile_path = 'logs/' + submission_id + '.txt'
        try:
            with open(logfile_path, 'w+') as logfile:
                sp.call(['latexmlc', '--timeout=240', '--dest=' + outpath, submission], stderr=logfile)
        except KeyboardInterrupt:
            # If I interrupt the conversion, remove the logfile so it can be reattempted
            print('You interrupted convert()!')
            print('Removing ' + logfile_path)
            os.remove(logfile_path)
            raise
        except Exception as e:
            print('Something went wrong in convert(): ' + e)
            print('Removing ' + logfile_path)
            os.remove(logfile_path)
            raise

Если я правильно понимаю документы и другие вопросы / ответы, если я передаю PIPE в stderr и буфер переполняется, процесс зависает, ожидая, пока буфер не очистится, чего с тех пор не происходитпоскольку call возвращается только после завершения процесса.Я не могу найти информацию о том, если передача дескриптора открытого файла вызывает ту же проблему взаимоблокировки.

Как я могу записать большой stderr в файл и предотвратить зависание подпроцесса?

...