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
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ámetrosstdout
ystdin
de la funciónsubprocess.Popen
. Esto creará una nueva tubería para la entrada/salida estándar del subproceso, con la cual puedes interactuar utilizando el métodocommunicate()
del objetoPopen
.Ejemplo:
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étodocommunicate()
. El argumentoinput
decommunicate()
es opcional y debe ser reemplazado con tu entrada, si la hay. Las variablesoutput
yerror
contendrán la salida estándar (stdout
) y el error estándar (stderr
) del subproceso, respectivamente.