之间有什么区别
os.close(sys.stdout.fileno())
和
sys.stdout.close()
我阅读了文档,看起来他们做了同样的事情,但有时当我调用前者时,我的文件描述符错误。
答案 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
会很高兴关闭那个,导致更多麻烦。
始终使用后者。更安全,更便携,更安全。