1

このコードを pexpect モジュールで動作させるには、ほとんど支援が必要ありません。

このコードは、サーバーにログインして git pull を実行し、最新のコード (アップグレードが利用可能な場合) をダウンロードするか、「既に最新です」というメッセージを送信します。

コードは実際にはパスワード画面を識別しますが、「すでに最新」というテキストを識別しません

ここに何か欠けているかどうかわかりません。

コードのスニペットは次のとおりです。

        p = pexpect.spawn('git pull',cwd = comp_dir,maxread = 10000, timeout = 100)
        i = p.expect(['password:','Already up-to-date.',pexpect.EOF])
        if i == 0:
            output_lines = p.before
            output_line_list = output_lines.split('\r\n')
            for line in output_line_list: print line
            count = 0
            p.sendline(pwd)
            while count < 3:  **# The server in case of unsuccessful login asks for password thrice so this check...  (not sure if there is a better way of achieving this)**
                try:
                    output = p.expect('Permission denied')
                    count+=1
                    p.sendline(pwd)
                    p.logfile = sys.stdout
                except:
                    print 'Successful Login !!!! ------'
                    p.expect('Already up-to-date',timeout=None)
                    count = 3
        if i == 1:
            output_lines = p.before
            output_line_list = output_lines.split('\r\n')
            for line in output_line_list: print line
            p.expect(pexpect.EOF)

どんな助けでも大歓迎です。

ありがとう、ビジェイ

4

1 に答える 1

1

この論理は少し間違っているようです。

最初に: 一連のプロンプトに期待しています

i = p.expect(['password:','Already up-to-date.',pexpect.EOF])

パスワードプロンプトが最初に送信されるため、これは正しく機能します。その後、プロンプトが表示された場合でも、「既に最新です。」

「パスワードが拒否されました」をチェックするように pexpect を変更しました

output = p.expect('Permission denied')

どの時点でも、expect ラインの 1 つだけがアクティブになっていると思います。また、プロンプトが発生した後に期待値を設定することはできません。

スクリプトを変更して、予想される行を順番にチェックする必要があります

i = p.expect(['password:','Already up-to-date.','Permission denied', pexpect.EOF])
if i == 0:
   .... send password
   i = p.expect(['password:','Already up-to-date.','Permission denied', pexpect.EOF])
if i == 2:
   .... send password
   i = p.expect(['password:','Already up-to-date.','Permission denied', pexpect.EOF])
if i == 1:
   .... print "already updated"
   i = p.expect(['password:','Already up-to-date.','Permission denied', pexpect.EOF])
if i == 3:
   .... print output

基本的に、アクティブな expect コマンドは常に 1 つだけです。行「xyz」を予期していて、「123」を受け取った場合。「xyz」を待つだけでタイムアウトになります。

于 2012-07-02T16:06:47.900 に答える