Сохранение stdout от подпроцесса. Popen в файл, плюс запись большего количества материала в файл

Я пишу сценарий Python, который использует подпроцесс. Popen для выполнения двух программ (из скомпилированного кода C), который каждый производит stdout. Сценарий получает тот вывод и сохраняет его в файл. Поскольку производство является иногда достаточно крупносерийным для сокрушения подпроцесса. КАНАЛ, заставляя сценарий зависнуть, я отправляю stdout непосредственно в файл журнала. Я хочу иметь свой сценарий, пишут, что что-то к началу и концу файла, и между этими двумя подобрабатывает. Вызовы Popen. Однако то, когда я смотрю на свой файл журнала, что-либо, что я записал в файл журнала из сценария, является всем вместе наверху файла, сопровождаемого всем исполняемым файлом stdout. Как я могу чередовать свой добавленный текст в файл?

def run(cmd, logfile):
    p = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=logfile)
    return p

def runTest(path, flags, name):
    log = open(name, "w")
    print >> log, "Calling executable A"
    a_ret = run(path + "executable_a_name" + flags, log)
    print >> log, "Calling executable B"
    b_ret = run(path + "executable_b_name" + flags, log)
    print >> log, "More stuff"
    log.close()

Файл журнала имеет: Вызов исполняемого файла исполняемый файл Вызова B Больше материала [... stdout от обоих исполняемых файлов...]

Существует ли способ, которым я могу сбросить A stdout к журналу после вызова Popen, например? Еще одна вещь, которая могла бы быть релевантной: Исполняемый файл A запускается, затем ожидает на B, и после B материал печати и концы, затем печать больше материала и концов.

Я использую Python 2.4 на Linux RHE.

21
задан jfs 22 November 2012 в 14:01
поделиться

3 ответа

Вы можете вызвать .wait() для каждого объекта Popen, чтобы убедиться, что он завершен, а затем вызвать log.flush(). Возможно, что-то вроде этого:

def run(cmd, logfile):
    p = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=logfile)
    ret_code = p.wait()
    logfile.flush()
    return ret_code

Если вам нужно взаимодействовать с объектом Popen в вашей внешней функции, вы можете перенести вызов .wait() туда.

21
ответ дан 29 November 2019 в 21:35
поделиться

Вам нужно дождаться завершения процесса, прежде чем продолжить. Я также переделал код для использования менеджера контекста, что более чисто.

def run(cmd, logfile):
    p = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=logfile)
    p.wait()
    return p

def runTest(path, flags, name):
    with open(name, "w") as log:
        print >> log, "Calling executable A"
        a_ret = run(path + "executable_a_name" + flags, log)
        print >> log, "Calling executable B"
        b_ret = run(path + "executable_b_name" + flags, log)
        print >> log, "More stuff"
2
ответ дан 29 November 2019 в 21:35
поделиться

Я говорю, пусть будет проще. Основная логика псевдокода:

write your start messages to logA
execute A with output to logA
write your in-between messages to logB
execute B with output to logB
write your final messages to logB
when A & B finish, write content of logB to the end of logA
delete logB
2
ответ дан 29 November 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: