es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

redirigir la transmisión estándar de subprocess en Python

Estoy intentando crear una plataforma de codificación en línea usando Python como backend. Estoy usando subprocess.Popen para ejecutar el código del usuario. Ahora quiero interactuar con él. Una forma que conozco es usando pipe y dup2, pero el problema es que cambia la entrada/salida estándar en el contexto de toda la aplicación de backend. Quiero que los cambios de las corrientes estándar sean solo para el subprocess.

¿Hay algún argumento que pueda pasar a subprocess.Popen para que la aplicación principal de Python pueda acceder a las corrientes estándar de su subprocess?

Ejemplo:

import subprocess
args=['py', path+'t.py']
p = subprocess.Popen(args)

t.py es un programa de Hola Mundo. El subprocess imprimirá Hola Mundo en la terminal, pero quiero redirigirlo a otro descriptor de archivo para poder acceder a él en una variable y enviarlo a través de la red. Lo mismo ocurre con la entrada.

ACTUALIZACIÓN:

Hice lo siguiente:

r, w = os.pipe()
p = subprocess.Popen(args, stdout=w)

Para esto, obtengo el siguiente error:

Excepción omitida en: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp1252'>
OSError: [Errno 22] Argumento no válido

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para evitar cambiar la entrada/salida estándar en el contexto de toda la aplicación backend, puedes utilizar el argumento subprocess.PIPE para los parámetros stdout y stdin de la función subprocess.Popen. Esto creará una nueva tubería para la entrada/salida estándar del subproceso, con la cual puedes interactuar utilizando el método communicate() del objeto Popen.

    Ejemplo:

    import subprocess
    
    args = ['py', 'ruta/al/t.py']
    p = subprocess.Popen(args, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
    
    output, error = p.communicate(input=b'cadena de entrada') # reemplaza b'cadena de entrada' con tu entrada
    

    En este ejemplo, la salida estándar (stdout) y la entrada estándar (stdin) del subproceso se redirigen a tuberías que son accesibles a través del método communicate(). El argumento input de communicate() es opcional y debe ser reemplazado con tu entrada, si la hay. Las variables output y error contendrán la salida estándar (stdout) y el error estándar (stderr) del subproceso, respectivamente.

Comments are closed.