¿Es posible comunicarse con un subproceso con subprocess.Popen?
-
05-07-2019 - |
Pregunta
Estoy tratando de escribir un script en python que contenga nuestro software. Este script necesita construir nuestro producto y empaquetarlo. Actualmente tenemos otros scripts que hacen cada pieza individualmente, que incluyen scripts csh y perl. Uno de estos scripts se ejecuta como:
sudo mod args
donde mod es un script de perl; así que en python lo haría
proc = Popen(['sudo', 'mod', '-p', '-c', 'noresource', '-u', 'dtt', '-Q'], stderr=PIPE, stdout=PIPE, stdin=PIPE)
El problema es que esta secuencia de comandos mod necesita algunas preguntas contestadas. Por esto pensé que lo tradicional
(stdout, stderr) = proc.communicate(input='y')
funcionaría. No creo que esté funcionando porque el proceso que controla Popen es sudo, no el script mod que hace la pregunta. ¿Hay alguna forma de comunicarse con el script mod y seguir ejecutándolo a través de sudo?
Solución
Elegiría ir con Pexpect.
import pexpect
child = pexpect.spawn ('sudo mod -p -c noresource -u dtt -Q')
child.expect ('First question:')
child.sendline ('Y')
child.expect ('Second question:')
child.sendline ('Yup')
Otros consejos
Creo que deberías eliminar el sudo
en tu llamada de Popen
y pedirle al usuario de tu script que escriba sudo .
Esto además hace más explícita la necesidad de privilegios elevados en su script, en lugar de ocultarlo dentro de Popen
.
Lo más sencillo sería ejecutar el script de control (el script de Python) a través de sudo
. ¿Puedes hacerlo o no es una opción?
Necesitamos más información.
- ¿Sudo te está pidiendo una contraseña?
- ¿Qué tipo de interfaz tiene el script mod para hacer preguntas?
Debido a que este tipo de cosas no se manejan normalmente en la tubería.
Una solución para ambos podría ser Pexpect , que es bastante experto en el manejo divertido scripts que solicitan contraseñas y otros problemas de entrada.