【问题标题】:File lives on windows vs linux in Python 3.4文件存在于 Python 3.4 中的 windows vs linux 上
【发布时间】:2017-04-19 14:45:56
【问题描述】:

我有一个脚本,我需要使用 Python 3.4 在 ubuntu 和 windows 上运行,当我在 windows 上运行时出现异常,"PermissionError: [WinError 32] The process cannot access the file because it is被另一个进程使用:'C:\Users\me\Desktop\tmp9uvk57b4.txt'" 在 linux 上,它可以正常工作。

我已将我的问题归结为这个示例 sn-p。我不确定问题出在哪里,但 sn-p 需要一些文本并将其写入临时文件。过了一会儿,它会删除临时文件,这就是错误出现的地方。

#!/usr/bin/env python3

import os
import tempfile

msg = "THIS IS A HORRIBLE MESSAGE"

txt = None

try:

    txt = tempfile.mkstemp(dir='.', suffix='.txt')[1]
    with open(txt, "w") as f:
        f.write(msg)

except Exception as exp:
    raise exp

finally:
    if txt:
        os.remove(txt)

我认为存在一些问题,即 windows 不关闭文件而 linux 关闭文件。我可以再次明确关闭它吗?这会在Linux上搞砸什么吗?有没有好的 windows/linux gotcha 资源?

【问题讨论】:

  • 您正在丢弃来自mkstemp 的文件描述符,这会使文件保持打开状态而不会删除共享。因此,您会遇到共享冲突。为什么不使用tempfile.NamedTemporaryFile?可以保证在 Windows 上将其删除,而无需手动删除它——即使进程被终止。

标签: python windows python-3.x ubuntu


【解决方案1】:

tempfile.mkstemp 有两个返回值,一个打开的文件句柄和文件名。您不使用打开的文件句柄,因此它永远不会关闭。因此错误消息。

import os
import tempfile

msg = "THIS IS A HORRIBLE MESSAGE"

fd, filename = tempfile.mkstemp(dir='.', suffix='.txt')
try:
    with os.fdopen(fd, "w") as f:
        f.write(msg)
finally:
    os.remove(filename)

【讨论】:

  • 完全正确。那确实解决了我的问题。我确实想知道为什么我的原始代码适用于 ubuntu 而不是 windows。但是,此解决方案适用于两者。
  • @LawfulEvil,Windows 通常要求对文件的所有打开引用来共享读取/执行、写入/追加和删除/重命名访问权限。 Python 通常以读写共享方式打开文件,但不会删除共享。 os.remove 在 Windows 上的工作方式是打开具有删除访问权限的句柄并调用系统函数来设置文件的删除处置。第一部分因共享冲突而失败,因为该文件已在未删除共享的情况下打开。 Linux/Unix 没有这个要求,所以在 Linux 上你只是默默地泄露了一个文件描述符。
猜你喜欢
  • 2016-02-24
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 2014-07-30
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多