examples example español python subprocess parent

español - subprocess python 3 example



El subproceso de Python obtiene la salida de los niños en archivo y terminal? (2)

La función call() es solo Popen(*args, **kwargs).wait() . Puede llamar a Popen directamente y usar el argumento stdout=PIPE para leer desde p.stdout :

import sys from subprocess import Popen, PIPE from threading import Thread def tee(infile, *files): """Print `infile` to `files` in a separate thread.""" def fanout(infile, *files): for line in iter(infile.readline, ''''): for f in files: f.write(line) infile.close() t = Thread(target=fanout, args=(infile,)+files) t.daemon = True t.start() return t def teed_call(cmd_args, **kwargs): stdout, stderr = [kwargs.pop(s, None) for s in ''stdout'', ''stderr''] p = Popen(cmd_args, stdout=PIPE if stdout is not None else None, stderr=PIPE if stderr is not None else None, **kwargs) threads = [] if stdout is not None: threads.append(tee(p.stdout, stdout, sys.stdout)) if stderr is not None: threads.append(tee(p.stderr, stderr, sys.stderr)) for t in threads: t.join() # wait for IO completion return p.wait() outf, errf = open(''out.txt'', ''w''), open(''err.txt'', ''w'') assert not teed_call(["cat", __file__], stdout=None, stderr=errf) assert not teed_call(["echo", "abc"], stdout=outf, stderr=errf, bufsize=0) assert teed_call(["gcc", "a b"], close_fds=True, stdout=outf, stderr=errf)

Estoy ejecutando un script que ejecuta varios ejecutables usando

subprocess.call(cmdArgs,stdout=outf, stderr=errf)

cuando outf / errf es Ninguno o un descriptor de archivo (diferentes archivos para stdout / stderr ).

¿Hay alguna manera de que pueda ejecutar cada exe para que stdout y stderr se escriban en los archivos y la terminal juntos?


Uso | tee | tee para redirigir la salida a un archivo llamado out.txt mientras obtiene el resultado en la terminal.

import subprocess # Run command and redirect it by | tee to a file named out.txt p = subprocess.Popen([command, ''|'', ''tee'', ''out.txt'']) p.wait()

En la plataforma de Windows, no hay | tee. Necesitamos usar Powershell. Entonces el comando en la tercera línea se convierte en:

# Run command in powershell and redirect it by | tee to a file named out.txt p = subprocess.Popen([''powershell'',''command, ''|'', ''tee'', ''out.txt''])

De esta manera, se imprime el stdout y el stdout también se almacenará en el archivo out.txt.