Gancho GIT -> Python -> Bash: ¿Cómo leer la input del usuario?

Estoy haciendo un gancho GIT en Python 3.5. La secuencia de commands python llama a una secuencia de commands Bash que lee la input del usuario mediante el command de read .

El script bash en sí mismo funciona, también cuando se llama directamente al script python, pero cuando GIT ejecuta el enganche escrito en Python, no funciona como se espera porque el usuario no solicita ninguna input del usuario.

Guión Bash:

 #!/usr/bin/env bash echo -n "Question? [Y/n]: " read REPLY 

GIT Hook (secuencia de commands de Python):

 #!/usr/bin/env python3 from subprocess import Popen, PIPE proc = Popen('/path/to/myscript.sh', shell=True, stderr=PIPE, stdout=PIPE) stdout_raw, stderr_raw= proc.communicate() 

Cuando ejecuto el script de Python, la read de Bash no parece estar esperando una input, y solo obtengo:

 b'\nQuestion? [Y/n]: \n' 

¿Cómo dejar que el script bash lea la input cuando se llama desde Python?

Añadiendo

 print(stdout_raw) print(stderr_raw) 

Muestra

 b'' b'/bin/sh: myscript.sh: command not found\n' 

aquí. Agregar ./ ​​al myscript.sh funcionó para READ una vez que python pudo encontrar el script. cwd = '.' en Popen también puede funcionar.

Resultó que el problema no tenía nada que ver con Python: si el gancho GIT llamaba a un script bash, tampoco podía solicitar la input.

La solución que encontré se da aquí .

Básicamente, la solución es agregar lo siguiente al script bash antes de la read :

 # Allows us to read user input below, assigns stdin to keyboard exec < /dev/tty 

En mi caso, también tuve que llamar al process bash simplemente como Popen(mybashscript) lugar de Popen(mybashscript, shell=True, stderr=PIPE, stdout=PIPE)) , por lo que el script puede salir libremente a STDOUT y no ser capturado en un PIPE.

Alternativamente, no modifiqué el script bash y en cambio lo usé en Python:

 sys.stdin = open("/dev/tty", "r") proc = Popen(h, stdin=sys.stdin) 

que también se sugiere en los comentarios del enlace mencionado anteriormente.