4

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

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. 但是一些资源表明 Python 总是或几乎总是对这样的代码使用引用计数,在这种情况下,文件句柄应该在完成后立即回收,并且subprocess.call不需要使用with

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

哪种方法最好?

4

3 回答 3

10

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

于 2011-03-04T17:07:54.293 回答
1

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

于 2011-03-04T16:59:24.160 回答
1

with声明的全部要点是有一个受控的清理过程。你做对了,不要让任何人说服你。

于 2011-03-04T17:17:45.803 回答