有什么区别
os.close(sys.stdout.fileno())
和
sys.stdout.close()
我阅读了文档,看起来他们做的是同样的事情,但有时当我调用前者时,我会收到错误的文件描述符错误。
请您参考如下方法:
请阅读这篇文章:sys.stdout and os.close
Python 文件对象是 C stdio 流之上的高级抽象层,而 C stdio 流又是(除其他外)低级 C 文件描述符之上的中级抽象层。
对于您通过内置的 open 构造函数在 Python 中创建的大多数文件对象,调用 close 从 Python 的角度将 Python 文件对象标记为已关闭,并且还会安排关闭底层 C 流。当 f 变成垃圾时,这也会自动发生在 f 的析构函数中。
但是stdin、stdout和stderr被Python特殊对待,因为C也赋予了它们特殊的地位。调用sys.stdout.close将Python级别的文件对象标记为关闭,但不会关闭关联的C流。
要关闭这三个之一的底层 C 流,您首先应该确定这是您真正想要做的(例如,您可能会混淆试图执行 I/O 的扩展模块)。如果是,请使用 os.close:
os.close(0) # close C's stdin stream
os.close(1) # close C's stdout stream
os.close(2) # close C's stderr stream
