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(),有没有办法检查并查看当我遍历返回的列表时我正在查看哪个流?
答案 0 :(得分:1)
我尝试在每个if-branch中打印出stream
,我得到了类似的结果:
<_io.BufferedReader name=5>
虽然它表示它是io.BufferedReader
,但似乎它继承了io.FileIO
的name
属性 - 在您的情况下,后者是真的:
名称可以是以下两种情况之一:
- 一个字符串或字节对象,表示将要打开的文件的路径。在这种情况下,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
我希望它有所帮助。