2017-04-19 56 views
0

我有一个脚本,我需要在Ubuntu和Windows上运行每个使用Python 3.4,当我在Windows上运行我得到一个异常,“PermissionError:[WinError 32]无法访问该文件,因为它正在被另一个进程使用:'C:\ Users \ me \ Desktop \ tmp9uvk57b4.txt'“而在Linux上,它无错误。文件生活在Windows与Linux的Python在Python 3.4

我把我的问题归结为这个示例代码片段。我不确定问题出在哪里,但代码片段需要一些文本并将其写入临时文件。一段时间后,它会删除临时文件,这是在错误的用武之地。

#!/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) 

我认为有一些问题,即虽然Linux确实窗口不关闭文件。我能否再次明确地关闭它?这会搞砸Linux上的任何东西吗?有没有一个很好的Windows/Linux gotcha资源?

+1

您正在从'mkstemp'丢弃文件描述符,这会使文件保持打开而不会删除共享。因此你会得到一个共享违规。你为什么不使用'tempfile.NamedTemporaryFile'?这将保证在Windows上被删除,而不必手动删除它 - 即使进程被终止。 – eryksun

回答

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) 
+0

非常正确。这确实解决了我的问题。我很想知道为什么我的原始代码在Ubuntu而不是Windows上工作。但是,这种解决方案对两者都有效。 – LawfulEvil

+0

@LawfulEvil,Windows通常需要所有对文件的开放引用来共享读取/执行,写入/附加以及删除/重命名访问。 Python通常以读写共享的方式打开文件,但不能删除共享。在Windows上运行'os.remove'的方式是打开一个具有删除访问权限的句柄,并调用一个系统函数来设置文件的删除处置。第一部分因共享冲突失败,因为该文件已经打开而没有删除共享。 Linux/Unix没有这个要求,所以在Linux上你只是无声无息地泄漏了一个文件描述符。 – eryksun