0

次のようなファブリック タスクがあります。

@task
def test():
    with settings(prompts={'This is a test.': 'q', 'question?':'answer'}):
        run("python test.py")

私の test.py スクリプトは次のようになります。

import subprocess, os
subprocess.call(['less', '-e', os.path.abspath('test.txt')])
response = raw_input("A question?")
print("response is [{0}]".format(response))

また、test.txt には以下が含まれます。

This is a test.

これを実行し、fabric にいくつかのプリントを追加して何が起こっているかを確認すると、実際にファイルを読んで fabric がテキストを見つけ、q と入力します。その後、raw_input で停止し、応答を送信します。しかし、raw_input は応答ではなく応答として "" を取得します!!

プロンプト dict から 'question?':'answer' を削除し、手動で回答を入力すると、やはり飲み込まれてしまいます...

ただし、'This is a test.': 'q' を削除して less コマンドを手動で終了すると、raw_input に対する手動または自動応答の両方が再び機能します。

後続の回答を飲み込まずに終了するにはどうすればよいですか? もちろん、これらのファイルを変更できない実際のシナリオを単純化しました...

4

1 に答える 1

2

これは、端末とインタラクティブモードに関係している必要があります+それに関する動作は少なくなります。

引数に追加pty=Falseすると、これで状況が解決するはずです。run(..)

于 2017-11-02T22:14:33.340 に答える