2009-07-22 17 views
1

WindowsでPython 3.0を使用していて、コマンドラインアプリケーションのテストを自動化しようとしています。ユーザーはTest Under Applicationにコマンドを入力することができ、2つのXMLパケットとして出力を返します。 1つはパケットで、もう1つはパケットです。これらのパケットを分析することによって、彼は結果を確認することができます。私はコードを以下のように解釈しますPython:サブプロセスモジュールを使用して別のコマンドラインアプリケーションを読み書きできません

p = subprocess.Popen(SomeCmdAppl, stdout=subprocess.PIPE, 

        shell = True, stdin=subprocess.PIPE, stderr=subprocess.STDOUT) 

p.stdin.write((command + '\r\n').encode()) 
time.sleep(2.5) 
testresult = p.stdout.readline() 
testresult = testresult.decode() 
print(testresult) 

私は出力を戻すことができません。私はreadline()を使って出力を読み込もうとしています。私は読んでみました()と私は手動でコマンドラインアプリケーションを実行すると、私は

Sent: <PivotNetMessage> 
<MessageId>16f8addf-d366-4031-b3d3-5593efb9f7dd</MessageId> 
<ConversationId>373323be-31dd-4858-a7f9-37d97e36eb36</ConversationId> 
<SageId>4e1e7c04-4cea-49b2-8af1-64d0f348e621</SagaId> 
<SourcePath>C:\Python30\PyNTEST</SourcePath> 
<Command>echo</Command> 
<Content>Hello</Content> 
<Time>7/4/2009 11:16:41 PM</Time> 
<ErrorCode>0</ErrorCode> 
<ErrorInfo></ErrorInfo> 
</PivotNetMessagSent> 

Recv: <PivotNetMessage> 
<MessageId>16f8addf-d366-4031-b3d3-5593efb9f7dd</MessageId> 
<ConversationId>373323be-31dd-4858-a7f9-37d97e36eb36</ConversationId> 
<SageId>4e1e7c04-4cea-49b2-8af1-64d0f348e621</SagaId> 
<SourcePath>C:\PivotNet\Endpoints\Pipeline\Pipeline_2.0.0.202</SourcePath> 
<Command>echo</Command> 
<Content>Hello</Content> 
<Time>7/4/2009 11:16:41 PM</Time> 
<ErrorCode>0</ErrorCode> 
<ErrorInfo></ErrorInfo> 
</PivotNetMessage> 

以下のように牽引XMLパケットとして戻って正しく出力を得る。しかし、私が使用した場合の通信コマンドを入力すると、それはあまりにも

を立ち往生()以下のように私は送信パケットを取得し、決してRecv:パケットを取得しません。なぜ私はrecvパケットを紛失していますか? (通信0は標準出力からすべてを持って来ることになっている。室温?

p = subprocess.Popen(SomeCmdAppl, stdout=subprocess.PIPE, 

        shell = True, stdin=subprocess.PIPE, stderr=subprocess.STDOUT) 
p.stdin.write((command + '\r\n').encode()) 
time.sleep(2.5) 
result = p.communicate()[0] 
print(result) 

誰でも動作するはずのサンプルコードで私を助けることができますか?読んで、別々のスレッドに書き込むために必要とされている場合、私は知りません。 。私を助けてください、私は繰り返し、読み出し/書き込みを行う必要があり、私が使用することができますPythonで任意の高度なレベルのモジュールがあり、私はPexpectモジュールは、Windowsで動作しないと思います

答えて

0

writeを使用する代わりにcommunicateを使用して入力を送信してみてください。。:

result = p.communicate((command + '\r\n').encode())[0] 
+0

私は戻って出力を送信して読む必要が入力コマンドの多くを持っています。コミュニケーションが可能ですか? –

+0

ああ、今問題が発生します。いいえ、ちがいます。あなたの質問には、知っておくことが重要であることを明記するべきです。私はこの答えを削除します。 – balpha

+0

あなたの答えを削除しないでください...それは助けました..しかし、comminucate()にもパケットがありません。それはちょうどパケットを得ます。私は何が欠けている –

1

一般的な問題、例えば参照:

(実際には、あなたがあなたの質問の作成中にこれらを見ている必要があります...?!)。

私が興味のある二つのものがあります(。(コマンド+ '\ rを\ n' は)(エンコード))

  • p.stdin.writeもあるので、あなたの子プロセスがいなくても可能性がありますをバッファリングその入力を見た。あなたはこのパイプを洗うことができます。
  • 他の質問の1つは、標準出力を行うことを提案しました。 readline()の代わりにread()を子供に読み込み、適切な文字数で読んでください。あなたはこれを試してみてください。

結果を投稿してください。

0

サブプロセスの代わりにpexpectを使用することを検討しましたか?おそらくあなたのコードが動作しないような詳細を処理します(バッファのフラッシュなど)。まだPy3kでは利用できないかもしれませんが、2.xでもうまくいきます。

参照:http://pexpect.sourceforge.net/pexpect.html

関連する問題