Подтвердить что ты не робот

Как отвечать на запросы автоматически с помощью python?

Я хочу запустить команду, которая подсказывает мне ввести yes/no или y/n или что-то еще. Если я просто запустил команду local("my_command"), то она остановится и попросит меня ввести. Когда я набираю то, что нужно, script продолжает работать. Как я могу автоматически отвечать на приглашение?

4b9b3361

Ответ 1

Начиная с версии 1.9, Fabric включает способ правильного управления этим.

В разделе о подсказках в документации Fabric говорится:

Словарь подсказок позволяет пользователям управлять интерактивными приглашениями. Если ключ в словаре находится в стандартном выпуске команд поток, Fabric автоматически ответит соответствующим значение словаря.

Вы должны быть в состоянии заставить Fabric автоматически отвечать на запросы следующим образом:

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

Ответ 2

Я использовал простые эхо-каналы для ответа на приглашения с помощью Fabric.

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

Ответ 3

Примечание: этот ответ несколько лет, и в то время как ткань имеет (интересно похожее) выполнение этого. См. Ответ @timothée-jeannin ниже.

См. fooobar.com/questions/246969/...

pip install fexpect

from ilogue.fexpect import expect, expecting, run 

prompts = []
prompts += expect('What is your name?','John')
prompts += expect('Are you at stackoverflow?','Yes')

with expecting(prompts):
    run('my_command')

Fexpect добавляет ответ на подсказки к ткани с использованием pexpect

Ответ 4

Чтобы немного расширить Timothée отличный ответ, здесь код, который Ткань используется при проверке словаря 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

Ткань использует .endswith для своей проверки, поэтому убедитесь, что в строку, которую вы используете в качестве ключа словаря prompts, включаете в себя конечные пробелы.

Например, скажем, вы пытаетесь автоматизировать запрос базы данных теста Django

Введите "да", если вы хотите попробовать удалить тестовую базу данных "test_my_app" или "no" для отмены:

Все, что нам нужно, достаточно конца подсказки, чтобы оно было уникальным. Включить конечные пробелы.

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,
                  )
       )

Ответ 5

Полагая это как ответ, хотя его комментарий от @BobNadler

run ( "yes | my_command" );