【问题标题】:How to check if stream returned by select.select() is stdout?如何检查 select.select() 返回的流是否为标准输出?
【发布时间】:2017-05-02 14:10:43
【问题描述】:
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(),当我遍历返回的列表时,有没有办法检查并查看我正在查看的流?

【问题讨论】:

    标签: python select io subprocess


    【解决方案1】:

    我尝试在每个 if-branch 中打印出stream,结果如下:

    <_io.BufferedReader name=5>
    

    虽然它说它是io.BufferedReader,但它似乎从io.FileIO 继承了name 属性-在您的情况下,后者是正确的:

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

    • 一个字符串或字节对象,表示将要打开的文件的路径。在这种情况下,closefd 必须为 True(默认值),否则会引发错误。
    • 一个整数,表示生成的 FileIO 对象将授予访问权限的现有操作系统级文件描述符的编号。当 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
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 2012-02-03
      • 2017-08-24
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多