32

yes/no または y/n などの入力を促すコマンドを実行したいと考えています。コマンドを実行するlocal("my_command")と停止し、入力を求められます。必要なものを入力すると、スクリプトは引き続き機能します。プロンプトに自動的に応答するにはどうすればよいですか?

4

6 に答える 6

23

Fabric でプロンプトに応答するために、単純なエコー パイプを使用しました。

run('echo "yes\n"| my_command')
于 2012-05-07T13:57:58.927 に答える
13

注:この回答は数年前のものであり、その間、ファブリックには(興味深いことに似た外観の)これが実装されています。以下の@timothée-jeanninによる回答を参照してください。

https://stackoverflow.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 stackoverflow?','Yes')

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

Fexpect は、pexpect を使用してファブリックにプロンプ​​トへの応答を追加します

于 2012-05-07T13:38:08.937 に答える
4

Timothée の優れた回答を少し拡張するために、辞書をチェックするときに Fabric が使用するコードを次に示します。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 はチェックに使用するため、辞書.endswithのキーとして使用する文字列の末尾にスペースを含めるようにしてください。prompts

たとえば、Django テスト データベース プロンプトを自動化しようとしているとします。

テスト データベース 'test_my_app' の削除を試みる場合は 'yes' を入力し、キャンセルするには '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,
                  )
       )
于 2016-11-21T16:38:09.897 に答える
2

@BobNadlerからのコメントですが、これを答えとして入れます

run("はい | my_command");

于 2015-05-29T00:14:19.350 に答える