如何检查select.select()返回的流是否为stdout?

时间:2017-05-02 14:10:43

标签: python select io subprocess

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(),有没有办法检查并查看当我遍历返回的列表时我正在查看哪个流?

1 个答案:

答案 0 :(得分:1)

我尝试在每个if-branch中打印出stream,我得到了类似的结果:

<_io.BufferedReader name=5>

虽然它表示它是io.BufferedReader,但似乎它继承了io.FileIOname属性 - 在您的情况下,后者是真的:

  

名称可以是以下两种情况之一:

     
      
  • 一个字符串或字节对象,表示将要打开的文件的路径。在这种情况下,closefd必须为True(默认值),否则将引发错误。
  •   
  • 一个整数,表示生成的FileIO对象将授予访问权限的现有OS级文件描述符的编号。当FileIO对象关闭时,此fd也将关闭,除非closefd设置为False。
  •   

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

我希望它有所帮助。