Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件存在于windows与Python 3.4中的linux上_Python_Windows_Python 3.x_Ubuntu - Fatal编程技术网

文件存在于windows与Python 3.4中的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上,它是无错误的 我已经将我的问题归结为这个示例片段。我不确定问题出在哪里,但代码段会获取一些文本并将其写入临时文件。一段时间后,它会删除临时文件,这就是产生错误的原因 #

我有一个脚本,我需要在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上,您只是悄悄地泄漏了一个文件描述符。