用Python关闭文件

用Python关闭文件,python,file-io,garbage-collection,with-statement,Python,File Io,Garbage Collection,With Statement,关于运行流程并放弃其输出的最简单方法,我建议使用以下代码: with open('/dev/null', 'w') as dev_null: subprocess.call(['command'], stdout=dev_null, stderr=dev_null) 另一位开发人员建议使用此版本: subprocess.call(['command'], stdout=open('/dev/null', 'w'), stderr=STDOUT) 我的C++程序员想说,当对象被释放时,

关于运行流程并放弃其输出的最简单方法,我建议使用以下代码:

with open('/dev/null', 'w') as dev_null:
    subprocess.call(['command'], stdout=dev_null, stderr=dev_null)
另一位开发人员建议使用此版本:

subprocess.call(['command'], stdout=open('/dev/null', 'w'), stderr=STDOUT)

我的C++程序员想说,当对象被释放时,是一个实现细节,所以为了避免在不确定的时间内打开文件句柄,我应该使用代码> <代码>。但是有人建议Python总是或几乎总是对这样的代码使用引用计数,在这种情况下,只要

subprocess.call
完成,就应该回收文件句柄,并且不需要使用
with

(我想让一个文件句柄打开给
/dev/null
并不重要,所以假设它是一个重要的文件。)


哪种方法最好?

当通向空设备的管道关闭时,这是不相关的-它不会导致输出中的数据丢失或类似的情况。虽然您可能希望始终将
变量一起使用,以确保输出文件始终正确地刷新和关闭,等等,但这并不是一个重要的示例。

您是正确的,不能保证引用。事实上,只有CPython(是的,它是主要的实现,但甚至不是唯一的一个)可以验证refcounting。如果CPython更改了该实现细节(不太可能,是的,但可能),或者您的代码在另一个实现上运行,或者您由于任何其他原因丢失了refcouting,则不会关闭该文件。因此,考虑到
with
语句使清理非常容易,我建议您在打开文件时始终使用上下文管理器。

with语句的整个要点是有一个受控的清理过程。你做得对,不要让任何人说服你。你应该更喜欢使用
os.devnull
而不是
'/dev/null'
。这比在这种情况下是否使用
with
这样的小细节更重要。如果您依赖
\uu del\uu
关闭文件,即使是现在的CPython也会发出资源警告。默认情况下,警告将被静音,但它仍然存在。