2012-04-30 20 views
1

私はエミュレートされたユーザーデータを使っていくつかのシェルコマンドを実行するプログラムを作成しようとしています。Pythonのpexpectが期待通りに動作しない

問題は、シェルコマンドは、コードの末尾に次の行せずに正常に動作しないことです:

raw_input('press <enter> to exit') 

は、どのように私は、その行を取り除くことができますか?

child = pexpect.spawn('grunt init:gruntfile') 
child.logfile_read = sys.stdout 

child.expect ('Is the DOM involved in ANY way?') 
child.sendline ('y') 
child.logfile_read = sys.stdout 

child.expect ('Will files be concatenated or minified?') 
child.sendline ('y') 
child.logfile_read = sys.stdout 

child.expect ('Will you have a package.json file?') 
child.sendline ('y') 
child.logfile_read = sys.stdout 

child.expect ('Do you need to make any changes to the above before continuing?') 
child.sendline ('n') 
child.logfile_read = sys.stdout 

raw_input('press <enter> to exit') 
+0

そのタイトルは冗談であることを意味します;-) – puk

答えて

6

問題は、子プロセスが終了する前に、プログラムを遅くするraw_inputせずに、あなたのPythonスクリプトが終了している(その過程で子プロセスを殺す)ことであるように思われます。

私はこの状況に対処することになっていると思いますが、子プロセスが終了した後に未読の出力があり、私の言うことができない子プロセスの詳細を知らないとwait()がハングするようにthe documentation発生するリスクがあるかどうか。 read()とwait()のいくつかの組み合わせがうまくいくかもしれませんが、それを理解するのが面倒すぎる場合は、数秒間だけtime.sleep()することができます。

+0

wait()はそれを行いました。どうもありがとう! – Theadamlt

+0

ドキュメントから、 'read()'が使われるべきであると聞こえます。引数が与えられていない場合は、EOFが得られるまで読み込まれます。 'read_nonblocking()'とは異なり、ブロックされている必要があります。プロセスが完了するのを待ちます。 – geon

関連する問題