在Python中关闭文件

Jos*_*ley 4 python file-io garbage-collection with-statement

在关于运行进程并丢弃其输出的最简单方法的讨论中,我建议使用以下代码:

with open('/dev/null', 'w') as dev_null:
    subprocess.call(['command'], stdout=dev_null, stderr=dev_null)
Run Code Online (Sandbox Code Playgroud)

另一位开发者建议这个版本

subprocess.call(['command'], stdout=open('/dev/null', 'w'), stderr=STDOUT)
Run Code Online (Sandbox Code Playgroud)

我的C++程序员想说的是,当对象被释放时是一个实现细节,所以为了避免文件句柄在不确定的时间段内打开,我应该使用with.但夫妇资源提到Python总是或几乎总是使用引用计数为这样的代码,在这种情况下,文件句柄应尽快回收subprocess.call等做用with是不必要的.

(我想/dev/null特别是把文件句柄打开是不太重要的,所以假装它是一个重要的文件.)

哪种方法最好?

小智 10

你是对的,refcouting 保证.事实上,只有CPython(这是主要的实现,是的,但甚至不是远程的唯一一个)提供了引用计数.如果CPython曾经更改过该实现细节(不太可能,是的,但可能),或者您的代码是在备用实现上运行,或者由于任何其他原因而丢失了引用,则该文件将不会被关闭.因此,鉴于该with语句使清理变得非常容易,我建议您在打开文件时始终使用上下文管理器.