【问题标题】:Closing files in Python在 Python 中关闭文件
【发布时间】:2011-07-08 23:28:20
【问题描述】:

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

(我想将文件句柄留给/dev/null 不太重要,所以假装它是一个重要文件。)

哪种方法最好?

【问题讨论】:

  • 您应该更喜欢使用os.devnull 而不是'/dev/null'。这比在这种情况下是否使用with 之类的小细节更重要。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果你依赖__del__ 来关闭你的文件,即使是现在的 CPython 也会发出 ResourceWarning。默认情况下,警告是静音的,但它仍然存在。
    【解决方案3】:

    with 语句的全部意义在于有一个受控的清理过程。你做得对,别让任何人说服你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2013-10-23
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多