python динамически отвечает да / нет на приглашение терминала - PullRequest
0 голосов
/ 10 мая 2018

генератор вопросов с подсказками

class SynthesisPromptGenerator:
    def wait_key(self):
        ''' Wait for a key press on the console and return it. '''
        result = None

        for singlePrompt in ["questionCat", "questionDog"]:
            try:
                result = raw_input(singlePrompt)
                print 'input is: ', result
            except IOError:
                pass

        return result

У меня есть PromptGenerator, который сгенерирует несколько вопросов с подсказками для терминала, и после ответа на первый вопрос появится второе, как

questionCat
(and wait for keyboard input)

questionDog
(and wait for keyboard input)

myцель состоит в том, чтобы автоматически и динамически отвечать на вопросы

class PromptResponder:
    def respond(self):
        generator = SynthesisPromptGenerator()
        child = pexpect.spawn(generator.wait_key())

        child.expect("\*Cat\*")
        child.sendline("yes")
        child.expect("\*Dog\*")
        child.sendline("no")
        child.expect(pexpect.EOF)


if __name__ == "__main__":
    responder = PromptResponder()
    responder.respond()
  • , если вопрос подсказки содержит Cat, затем ответить yes
  • , если запрос подсказки содержит Dog, тоответ no

Итак, что касается:

  1. как получить строку приглашения из терминала и выполнить фильтрацию на ее основе?
  2. как ответитьнесколько вопросов с подсказками в python?

Я провел какой-то поиск, но обнаружил, что большинство вопросов касаются сценария оболочки echo yes | ./script, не так много это делают in python

большое спасибо

1 Ответ

0 голосов
/ 10 мая 2018

Как предлагается в комментариях, используйте pexpect.

См. pexpect на github , официальные документы и , этот удобный питон для начинающих, прохождение по pexpect .

Для примера. Допустим, это ваш x.sh файл:

#!/bin/bash

echo -n "Continue? [Y/N]: "
read answer
if [ "$answer" != "${answer#[Yy]}" ]; then
        echo -n "continuing.."
else
        echo -n "exiting.."
fi

Вы можете сделать это:

import os, sys
import pexpect

# It's probably cleaner to use an absolute path here
# I just didn't want to include my directories..
# This will run x.sh from your current directory.
child = pexpect.spawn(os.path.join(os.getcwd(),'x.sh'))
child.logfile = sys.stdout
# Note I have to escape characters here because
# expect processes regular expressions.
child.expect("Continue\? \[Y/N\]: ")
child.sendline("Y")
child.expect("continuing..")
child.expect(pexpect.EOF)
print(child.before)

Результат скрипта python:

Continue? [Y/N]: Y
Y
continuing..

Хотя я должен сказать, что немного странно использовать pexpect со скриптом bash, если у вас есть возможность его редактировать. Было бы проще отредактировать скрипт так, чтобы он больше не запрашивал:

#!/bin/bash

echo -n "Continue? [Y/N]: "
answer=y
if [ "$answer" != "${answer#[Yy]}" ]; then
        echo "continuing.."
else
        echo "exiting.."
fi

Тогда вы можете просто использовать subprocess для его выполнения.

import os
import subprocess

subprocess.call(os.path.join(os.getcwd(),"x.sh"))

Или, если вы хотите вывод в виде переменной:

import os
import subprocess

p = subprocess.Popen(os.path.join(os.getcwd(),"x.sh"), stdout=subprocess.PIPE)
out, error = p.communicate()

print(out)

Я понимаю, что это может быть невозможно для вас, но это стоит отметить.

...