代码之家  ›  专栏  ›  技术社区  ›  keypoint

python对终端提示动态回答是/否

  •  1
  • keypoint  · 技术社区  · 6 年前

    提示问题生成器

    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)
    

    我的目标是自动、动态地回答问题

    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中回答多个提示问题?

    我做了一些搜索,但发现大多数问题都是针对shell脚本的 echo yes | ./script ,做的不多 in python

    非常感谢你

    1 回复  |  直到 4 年前
        1
  •  1
  •   Zhenhir    6 年前

    按照评论中的建议,使用 pexpect

    看见 pexpect on github ,则, the official docs this handy python for beginners walkthrough on 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)
    

    我意识到这对你来说可能不可能,但值得一提。