文件存在于windows与Python 3.4中的linux上
我有一个脚本,我需要在ubuntu和windows上分别使用Python3.4运行,当我在windows上运行时,会出现一个异常,“PermissionError:[WinError 32]进程无法访问该文件,因为它正被另一个进程使用:'C:\Users\me\Desktop\tmp9uvk57b4.txt'”,而在linux上,它是无错误的 我已经将我的问题归结为这个示例片段。我不确定问题出在哪里,但代码段会获取一些文本并将其写入临时文件。一段时间后,它会删除临时文件,这就是产生错误的原因文件存在于windows与Python 3.4中的linux上,python,windows,python-3.x,ubuntu,Python,Windows,Python 3.x,Ubuntu,我有一个脚本,我需要在ubuntu和windows上分别使用Python3.4运行,当我在windows上运行时,会出现一个异常,“PermissionError:[WinError 32]进程无法访问该文件,因为它正被另一个进程使用:'C:\Users\me\Desktop\tmp9uvk57b4.txt'”,而在linux上,它是无错误的 我已经将我的问题归结为这个示例片段。我不确定问题出在哪里,但代码段会获取一些文本并将其写入临时文件。一段时间后,它会删除临时文件,这就是产生错误的原因 #
#!/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资源?
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)
您正在丢弃
mkstemp
中的文件描述符,该描述符使文件保持打开状态而不进行删除共享。因此,您得到了共享冲突。为什么不使用tempfile.NamedTemporaryFile
?它保证在Windows上被删除,而不必手动删除它——即使进程被终止。完全正确。这确实解决了我的问题。我想知道为什么我的原始代码可以在ubuntu上运行,而不能在windows上运行。但是,此解决方案同时适用于这两种情况。@LawfulEvil,Windows通常要求对文件的所有打开引用共享读/执行、写/追加和删除/重命名访问。Python通常使用读写共享打开文件,但不使用删除共享。在Windows上,os.remove
的工作方式是打开一个具有delete访问权限的句柄,并调用系统函数来设置文件的删除配置。第一部分因共享冲突而失败,因为该文件已在没有删除共享的情况下打开。Linux/Unix没有这个要求,所以在Linux上,您只是悄悄地泄漏了一个文件描述符。