1

コマンドラインから実行する小さなtest.shスクリプトがあり./test.sh、入力した2つの質問への入力を求められます。その後、スクリプトが終了するまでループしますctrl-c

を実行できる小さなPythonスクリプトを作成しtest.sh、Pythonで設定した変数var1とvar2からスクリプトの質問への入力を入力したいと思います。

また、xを長くループしてtest.shを実行し、それを終了して、var3の値に基づいてx分ごとに再起動する別の変数var3が必要です。

test.sh私はこのコードを書きましたが、起動後にコマンドが渡されないようです。

import os
os.system('./test.sh arg1')
time.sleep(10)
sh('input answer 1')
time.sleep(5)
sh('input answer 2')

現在、私のコードはこのスレッドに基づいて次のように更新されています。

#!/usr/bin/env python

import pexpect
import sys
import os
child = pexpect.spawn ('./test.sh -arg1')
child.expect ('some expected output from the .sh file')
child.expect ('more expected output from the .sh file')
child.expect ('(?i)Enter Username:')
child.sendline ('myusername')
child.expect ('(?i)Enter Password:')
child.sendline ('mypassword')
# sys.stdout.write (child.after)
# sys.stdout.flush()
time.sleep(30)
child.sendcontrol('c')
child.close()
print 'Goodbye'

--修正済み--問題は、タイムアウトまたはスリープが中断されていることです。おそらく、.shスクリプトの出力が原因です。このスクリプトをtimeoutまたはtime.sleepのコメントなしで実行すると、影響がなく、child.close()に直接到達してプログラムが終了するか、child.sendline('mypassword')がハングアップします。なんらかの理由で、.shスクリプトのパスワードプロンプトでスタックします...おそらく、対話できないため、実際にはスタックしていません。 - 修繕 -

スクリプトを30秒(またはx)一時停止すると、あとはすべてをx回ループさせるだけです。最後に、エラーチェックを追加する必要があります。これは、.SHがさまざまなテキスト文字列で応答するため、スクリプトをすぐに再実行する必要があることを示している可能性があります。

みんなの助けてくれてありがとう!

4

2 に答える 2

2

使用pexpect

import pexpect  # $ pip install pexpect

while var3:  # start ./test.sh again
    output = pexpect.run('./test.sh arg1', 
        timeout=x,  # terminate child process after x seconds
        events={r'(?i)question 1': var1,  # provide answers
                r'(?i)question 2': var2})  

注:subprocessベースのソリューションは、バッファリングの問題のためにより複雑になる可能性があり、さらにptyselectモジュールなど必要になる場合があります。

于 2012-12-24T20:03:10.027 に答える
1
import subprocess
p = subprocess.Popen('./test.sh arg1', stdin=subprocess.PIPE, stdout=subprocess.PIPE)

time.sleep(10)
p.stdin.write('input answer 1') #Probably adding \n is necessary
time.sleep(5)
p.stdin.write('input answer 2') #Probably adding \n is necessary

print p.stdout.readline() # To print one-line output of the shell script
于 2012-12-24T19:55:45.420 に答える