2017-05-02 9 views
0
proc = subprocess.Popen(cmd, shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE) 
ready = select.select([proc.stdout, proc.stderr], [], [])[0] 
for stream in ready: 
    if stream == proc.stdout: 
     # do something 
    elif stream == proc.stderr: 
     # do something else 
    else: 
     # error 

stdoutとstderrの両方をselect.select()に渡すと、返されたリストを反復処理するときに、どのストリームを調べているのかを確認する方法はありますか?select.select()によって返されたストリームがstdoutであるかどうかをチェックする方法?

答えて

1

分岐あれば、私はこのようなものだ私は、各streamをプリントアウトしようとした:それはio.BufferedReaderだと言うが、それはio.FileIOからname属性を継承するようだ

<_io.BufferedReader name=5> 

を - あなたのケースで、後者真である:

名は、2つのいずれかを指定できます

  • 開かれるファイルへのパスを表す文字ストリングまたはバイトオブジェクト。この場合、closefdはTrue(デフォルト)でなければなりません。それ以外の場合はエラーが発生します。
  • 結果のFileIOオブジェクトがアクセスする既存のOSレベルのファイル記述子の番号を表す整数。 FileIOオブジェクトがクローズされると、closefdがFalseに設定されていない限り、このfdも閉じられます。

name属性は、対応するストリームにユニークだったので、私はあなたが行うことができると思います:

proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

out_stream_name = proc.stdout.name 
err_stream_name = proc.stderr.name 

ready = select.select([proc.stdout, proc.stderr], [], [])[0] 
for stream in ready: 
    if stream.name == out_stream_name: 
     # looking at stdout 
    elif stream.name == err_stream_name: 
     # looking at stderr 
    else: 
     # unknown 

私はそれが役に立てば幸い。

関連する問題