traduccion examples python command-prompt fabric

python - examples - pip install fabric



¿Cómo responder a las preguntas automáticamente con el tejido de python? (6)

Quiero ejecutar un comando que me pide que ingrese sí / no o y / n o lo que sea. Si simplemente ejecuto el comando local("my_command") entonces se detiene y me pide una entrada. Cuando escribo lo que se necesita, el script sigue funcionando. ¿Cómo puedo responder automáticamente al aviso?


A partir de la versión 1.9 , Fabric incluye una forma de gestionar esto correctamente.

La sección sobre solicitudes en la documentación de Fabric dice:

El diccionario de solicitudes permite a los usuarios controlar las solicitudes interactivas. Si se encuentra una clave en el diccionario en el flujo de salida estándar de un comando, Fabric responderá automáticamente con el valor del diccionario correspondiente.

Deberías poder hacer que Fabric responda automáticamente a preguntas como esta:

with settings(prompts={''Do you want to continue [Y/n]? '': ''Y''}): run(''apt-get update'') run(''apt-get upgrade'')


En Fabric 2.1 , esto se puede lograr usando el ejemplo de respuesta automática que está disponible a través del paquete de invocación (una dependencia de Fabric 2.1):

>>> from invoke import Responder >>> from fabric import Connection >>> c = Connection(''host'') >>> sudopass = Responder( ... pattern=r''/[sudo/] password:'', ... response=''mypassword/n'', ... ) >>> c.run(''sudo whoami'', pty=True, watchers=[sudopass]) [sudo] password: root <Result cmd=''sudo whoami'' exited=0>

Tenga en cuenta que esto no se limita a las contraseñas de sudo y se puede usar en cualquier lugar donde tenga un patrón que coincida y una respuesta enlatada (que puede no ser una contraseña).

Hay un par de consejos:

  1. pty=True es probablemente siempre necesario
  2. El pattern especificado en el Servicio de Responder menudo puede incluir espacios al final de la línea, así que intente agregar espacios cuando el watcher no parezca coincidir.
  3. De acuerdo con la nota discutida al final de los documentos del observador :

    El argumento de patrón para el Respondedor se trata como una expresión regular, que requiere más atención (observe cómo tuvimos que escapar de nuestros corchetes en el ejemplo anterior) pero también proporcionó más poder.

    Entonces, no olvides escapar (usando barras invertidas) donde sea necesario.


He usado tubos de eco simples para responder a las preguntas con Fabric.

run(''echo "yes/n"| my_command'')


Para ampliar un poco la excelente respuesta de Timothée , aquí está el código que utiliza Fabric al revisar el diccionario de prompts .

def _get_prompt_response(self): """ Iterate through the request prompts dict and return the response and original request if we find a match """ for tup in env.prompts.iteritems(): if _endswith(self.capture, tup[0]): return tup return None, None

Fabric usa .endswith para su verificación, así que asegúrate de incluir espacios en la cadena que usas como clave en el diccionario de prompts .

Por ejemplo, digamos que está intentando automatizar el indicador de la base de datos de prueba de Django

Escriba ''sí'' si desea intentar eliminar la base de datos de prueba ''test_my_app'', o ''no'' para cancelar:

Todo lo que necesitamos es suficiente con el final de la solicitud para que sea único. Incluir espacios finales.

django_test_database_prompt = "or ''no'' to cancel: " # won''t work without this trailing space ^ with settings( prompts={django_test_database_prompt : ''yes''} ): run(''%s %s'' % (virtualenv_python_path, test_runner_file_path, ) )


Poner esto como una respuesta, aunque es un comentario de @BobNadler

ejecutar ("yes | my_command");


Nota: esta respuesta tiene varios años de antigüedad, y mientras tanto, la estructura del tiempo tiene una implementación de esto (de aspecto similarmente interesante). Vea la respuesta de @ timothée-jeannin a continuación.

Consulte https://.com/a/10007635/708221

pip install fexpect

from ilogue.fexpect import expect, expecting, run prompts = [] prompts += expect(''What is your name?'',''John'') prompts += expect(''Are you at ?'',''Yes'') with expecting(prompts): run(''my_command'')

Fexpect agrega respuestas a las solicitudes a la estructura con el uso de pexpect