在Python中关闭文件

时间:2011-03-04 16:48:28

标签: python file-io garbage-collection with-statement

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

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。但是coupleresources表明Python总是或几乎总是对这样的代码使用引用计数,在这种情况下,只要subprocess.call完成并使用{{{{}}}就应该回收文件句柄。 1}}是不必要的。

(我想将文件句柄特别打开with不太重要,所以假装它是一个重要文件。)

哪种方法最好?

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:1)

当关闭空设备的管道无关紧要时 - 它不会导致输出中的数据丢失或某些此类数据丢失。虽然您可能希望始终使用with变量来确保输出文件始终正确刷新和关闭等,但这不是一个重要的示例。

答案 2 :(得分:1)

with语句的全部内容是进行受控清理过程。你做得对,不要让任何人说服你。