【问题标题】:python: need to close file from mkstemp if I use fdopen?python:如果我使用 fdopen,需要从 mkstemp 关闭文件吗?
【发布时间】:2011-12-09 14:59:36
【问题描述】:

以下哪个更正确?

fi, path = tempfile.mkstemp()
f = os.fdopen(fi, "w")
f.write(res)
f.close()
os.close(fi)

或:

fi, path = tempfile.mkstemp()
f = os.fdopen(fi, "w")
f.write(res)
f.close()

【问题讨论】:

    标签: python file file-io operating-system


    【解决方案1】:

    如果您需要路径,请继续跟进最新答案:

    f_handle, f_path = tempfile.mkstemp()
    with os.fdopen(f_handle, 'w') as f:
        f.write(res)
    
    try:
        # Use path somehow
        some_function(f_path)
    
    finally:
        # Clean up
        os.unlink(f_path)
    

    【讨论】:

      【解决方案2】:

      如果你要写最后一个例子,你需要:

      with os.fdopen(tempfile.mkstemp()[0], 'w') as f:
           f.write(res)
      

      【讨论】:

        【解决方案3】:

        如果在足够新的 Python 上,您可以将其降低到:

        with os.fdopen(tempfile.mkstemp()[0]) as f:
            f.write(res)
        

        【讨论】:

        • 呵呵很好,但在这种情况下我需要路径
        【解决方案4】:

        我愿意:

        fi, path = tempfile.mkstemp()
        f = os.fdopen(fi, "w")
        try:
          f.write(res)
        finally:
          f.close()
        

        【讨论】:

          【解决方案5】:

          勾选f.fileno(),应该和fi一样。您应该只关闭该文件描述符一次,所以第二个是正确的。

          在 Unix 上,第一个会导致错误:

          >>> f.close()
          >>> os.close(fi)
          Traceback (most recent call last):
            File "<stdin>", line 1, in <module>
          OSError: [Errno 9] Bad file descriptor
          

          【讨论】:

          • 明白了。有点混乱:打开两次,关闭一次。但我明白了
          • os.fdopen() 不一定打开文件描述符,它只是为文件描述符返回一个打开的文件对象。如果文件描述符已经打开,它将不会再次打开它。
          • @Claudiu:这是因为操作系统在文件 descriptors(它们是操作系统级别的对象)和文件 streams(它们是libc 级对象)。 fopen(Python 中的open)打开一个描述符,然后使用这个描述符打开一个流。 fdopen 使用现有描述符打开一个新流。 fclose(Python 中的file.close)关闭流及其底层描述符。
          猜你喜欢
          • 2014-06-20
          • 2014-03-08
          • 1970-01-01
          • 2019-08-01
          • 2013-01-10
          • 1970-01-01
          • 1970-01-01
          • 2018-05-17
          • 2016-01-10
          相关资源
          最近更新 更多