Я пишу сценарий 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.
Вы можете вызвать .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() туда.
Вам нужно дождаться завершения процесса, прежде чем продолжить. Я также переделал код для использования менеджера контекста, что более чисто.
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"
Я говорю, пусть будет проще. Основная логика псевдокода:
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