Estoy escribiendo un script python que usa subprocess.Popen para ejecutar dos programas (a partir del código C compilado) que producen stdout. El script obtiene esa salida y la guarda en un archivo. Debido a que el resultado a veces es lo suficientemente grande como para abrumar el subproceso.PIPE, haciendo que el script se cuelgue, envío el stdout directamente al archivo de registro. Quiero que mi script escriba algo al principio y al final del archivo, y entre los dos subprocesos. Llamadas de acceso público. Sin embargo, cuando miro mi archivo de registro, todo lo que escribí en el archivo de registro del script está todo junto en la parte superior del archivo, seguido de todo el stdout ejecutable. ¿Cómo puedo intercalar mi texto agregado al archivo?Guardar stdout del subproceso.Pobre al archivo, además de escribir más cosas en el archivo
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()
El archivo de registro tiene: Calling ejecutable Un Calling ejecutable B Más cosas [... stdout de ambos ejecutables ...]
¿Hay alguna manera de eliminar la salida estándar de la A a la el registro después de llamar a Popen, por ejemplo? Una cosa más que podría ser relevante: el Ejecutable A se inicia y luego se pone en B, y luego de que B imprima y termine, A imprime más y finaliza.
Estoy usando Python 2.4 en RHE Linux.
Cuando usé stdout = subprocess.PIPE y tuve el bucle externo, escribí todo en el archivo de registro, pude intercalar mi propio texto con el resultado de los ejecutables. Cuando no agrego texto, el registro tiene contenido en este orden: 1) Una salida 2) Salida B 3) Resto de una salida. Podría agregar texto antes o después de cada uno de esos pasos. Ahora solo puedo agregar texto al inicio o al final del registro. Agregar un wait() después de que Popen cuelgue el script porque B no se iniciará hasta que A finalice, lo que no ocurrirá, porque A espera el handshaking desde B. ¿Es posible intercalar mi propio texto en el registro con este enfoque? – jasper77