在python中关闭流的不同方法

时间:2014-08-16 05:46:47

标签: python

之间有什么区别
os.close(sys.stdout.fileno())

sys.stdout.close()

我阅读了文档,看起来他们做了同样的事情,但有时当我调用前者时,我的文件描述符错误。

2 个答案:

答案 0 :(得分:5)

请阅读这篇文章:sys.stdout and os.close

Python文件对象是C stdio流之上的高级抽象层,而C stdio流又是(除其他之外)低级C文件描述符之上的中级抽象层。

对于您通过内置的开放构造函数在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

答案 1 :(得分:2)

你可能不想做前者。它将关闭sys.stdout下的文件描述符。稍后当sys.stdout被取消分配时(例如,如果你重新分配它),你会收到一个错误,因为stdout的文件描述符突然消失了(从Python对象的角度来看)。

更糟糕的是,如果你在此期间打开了一些其他文件,文件描述符可能会被重用,而sys.stdout会很高兴关闭那个,导致更多麻烦。

始终使用后者。更安全,更便携,更安全。