Skip to main content
 首页 » 编程设计

python之在 python 中关闭流的不同方法

2025年05月04日17lidabo

有什么区别

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