subprocess.Popen

Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)

Este método ejecuta un programa hijo en un nuevo proceso.

Son varios los argumentos que recibe, entre ellos:

args es un string o tupla con la secuencia de programa y argumentos.

bufsize es el argumento pasado para el buffering de la función open() cuando se crean los ficheros objeto con los pipes de stdin/stdout/stderr.

executable es un programa de reemplazo a ejecutar.

stdin, stdout y stderr son los ficheros que manejan la entrada, salida y error estándar.

preexec_fn (solo POSIX) es un objeto a ser llamado en el proceso hijo justo antes de que sea ejecutado.

close_fds controla el cierre o la herencia de los descriptores de archivos.

shell si es True el comando será ejecutado a través del shell.

cwd establece el directorio actual antes de que se ejecute el proceso hijo.

env define las variables para el nuevo proceso.

text si es True hace el decode de stdin, stdout y stderr usando el encoding establecido o el del sistema en caso de no estar establecido.

Y los métodos son:

comunícate(self, input=None, timeout=None)

Interactua con el proceso enviando datos a stdin y cerrándolo. Lee datos de stdout y stderr hasta que se alcance el fin de fichero. Espera que el proceso termine.

kill(self)

Mata el proceso con SIGKILL, es decir con un apagado forzoso del proceso.

poll(self)

Revisa si el proceso hijo ha terminado. Establece y devuelve el atributo returncode.

send_signal(self, sig)

Envía una señal al proceso.

terminate(self)

Termina el proceso con SIGTERM, es decir enviando una señal al proceso para que se cierren conexiones, ficheros, etc.

wait(self, timeout=None)

Espera a que finalice el proceso hijo devolviendo su self.returncode.

Ejemplos

En el siguiente ejemplo se ejecuta un proceso, find / ., que muestra el nombre de todas las carpetas y archivos del disco. Un bucle muestra en la pantalla el contenido de las líneas de stdout mientras que el resultado devuelto por el método poll sea None. Cuando termine el proceso el resultado será el returncode y el bucle finalizará. Con esto se consigue mostrar en tiempo real la salida estándar que se produce mientras se ejecuta el proceso hijo.

import subprocess
p = subprocess.Popen(('find','/','.'), stdout = subprocess.PIPE)
while p.poll() is None:
    print(p.stdout.readline().decode("utf-8").strip())

Se puede finalizar el proceso de una forma amistosa con el método terminate, cuando se cumpla una condición o pasado algún tiempo, este ejemplo finaliza el proceso después de cinco segundos de ejecución. Para ello toma el valor del tiempo de inicio en segundos y lo comprueba con el actual, si es igual o mayor que 5 llama al método terminate.

import subprocess
import time
inicio = time.time()
p = subprocess.Popen(('find','/','.'), stdout = subprocess.PIPE)
while p.poll() is None:
    print(p.stdout.readline().decode("utf-8").strip())
    if time.time()-inicio >= 5:
        p.terminate()

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *