2

コマンドラインアプリケーション用にPythonでテストフレームワークを作成しています。アプリケーションはディレクトリを作成し、現在のディレクトリで他のシェルスクリプトを呼び出し、Stdoutに出力します。

{Python-SubProcess、CommandLine}コンボを{Selenium、Browser}と同等に処理しようとしています。最初のコンポーネントは2番目のコンポーネントで何かを再生し、出力が期待されるかどうかをチェックします。私は次の問題に直面しています

  1. Popenコンストラクトはコマンドを受け取り、そのコマンドが完了すると戻ります。私が欲しいのは、プロセスへのライブハンドルです。これにより、さらにコマンドと検証を実行し、完了したら最後にシェルを閉じることができます。
  2. このようなテストが必要なコマンドラインアプリケーションがたくさんあるので、これを実現するためのインフラストラクチャコードを記述しても問題ありません。

これが私が実行しているサンプルコードです

 p = subprocess.Popen("/bin/bash", cwd = test_dir)
 p.communicate(input = "hostname") --> I expect the hostname to be printed out
 p.communicate(input = "time") --> I expect current time to be printed out 

しかし、プロセスがハングするか、何か間違ったことをしている可能性があります。また、そのサブプロセスの出力を「取得」して、何かが存在することを表明できるようにするにはどうすればよいですか?

4

2 に答える 2

2

subprocess.Popenプロセス開始後も実行を継続できます。オブジェクトは、実行中に子プロセスと通信するための、および他の多くのメソッドを公開しPopenます。それはあなたが必要なものではありませんか?wait()poll()

詳細については、 PopenコンストラクターPopenオブジェクトの説明を参照してください。

UnixシステムでBashを実行し、コマンドを実行する小さな例を次に示します。

from subprocess import Popen, PIPE
p = Popen (['/bin/sh'], stdout=PIPE, stderr=PIPE, stdin=PIPE)
sout, serr = p.communicate('ls\n')
print 'OUT:'
print sout
print 'ERR:'
print serr

UPD: communicate()プロセスの終了を待ちます。それが必要ない場合は、適切なパイプを直接使用できますが、通常はかなり醜いコードになります。

UPD2:質問を更新しました。communicateはい、 1つのプロセスに対して2回呼び出すことはできません。1回の呼び出しで実行する必要のあるすべてのコマンドを指定して出力全体を確認するか、communicateパイプ(、、Popen.stdin)を操作することができます。可能であれば、最初の解決策(を使用)を強くお勧めします。Popen.stdoutPopen.stderrcommunicate

それ以外の場合は、コマンドを入力して、目的の出力が得られるまでしばらく待つ必要があります。必要なのは、読み取るものがないときにハングしないようにするためのノンブロッキング読み取りです。これは、スレッドを使用してパイプで非ブロッキングモードをエミュレートする方法のレシピです。コードは、そのような些細な目的のために醜くて奇妙に複雑ですが、それが行われている方法です。

p.stdout.fileno()別のオプションを呼び出しに使用することもできますがselect.select()、それはWindowsでは機能しません(Windowsではselect、WinSockから発信されたオブジェクトでのみ動作します)。Windowsを使用していない場合は、これを検討してください。

于 2013-03-04T16:01:07.387 に答える
2

プレーンを使用する代わりに、subprocessPythonshライブラリが非常に役立つ場合があります。

http://amoffat.github.com/sh/

shを使用して非同期相互作用ループを構築する方法の例を次に示します。

http://amoffat.github.com/sh/tutorials/2-interacting_with_processes.html

この問題を解決するための別の(古い)ライブラリはpexpectです:

http://www.noah.org/wiki/pexpect

于 2013-03-04T17:18:34.750 に答える