yes/no または y/n などの入力を促すコマンドを実行したいと考えています。コマンドを実行するlocal("my_command")
と停止し、入力を求められます。必要なものを入力すると、スクリプトは引き続き機能します。プロンプトに自動的に応答するにはどうすればよいですか?
6 に答える
Fabric でプロンプトに応答するために、単純なエコー パイプを使用しました。
run('echo "yes\n"| my_command')
注:この回答は数年前のものであり、その間、ファブリックには(興味深いことに似た外観の)これが実装されています。以下の@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')
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,
)
)
@BobNadlerからのコメントですが、これを答えとして入れます
run("はい | my_command");