检查文件描述符是否有效。

13

如何检查给定的文件描述符是否有效?如果fd=3可用,我想写入它;否则,我想写到标准输出。我知道可以在每个os.write调用上包装try-except语句,但我希望事先知道fd=3是否可写。

2个回答

9
你可以使用os.fstat来确定每次写入之前文件描述符是否有效,但是由于无效的文件描述符会引发OSError异常,因此你仍需要使用try/except语句进行包装。你可能最好还是创建自己的写入函数,并加上try/except语句。
def write(data, fd=3):
    try:
        os.write(fd, data)
    except OSError:
        sys.stdout.write(data)

3
如何在开始时尝试使用os.write写入fd=3(在try-except块内),并根据其成功与否更改所有后续行为呢?
这样,您就不必在每个调用中都包装try-except。当然,如果在问题解决过程中fd=3不再有效(例如,如果它是从另一端关闭的管道),则此方法将失效。

1
我建议尝试调用os.fstat并检查模式位,而不是使用os.write,以避免向文件描述符写入垃圾数据的副作用。但除此之外,确实,使用try/except是解决这个问题的完美习语。"宁愿请求原谅等等" - Chris Farmiloe
@Chris Farmiloe:os.fstat 能检测到一个断开的管道吗? - NPE
是的,会引发一个"操作已关闭的文件"的ValueError错误,我相信。 - Chris Farmiloe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接