代码之家  ›  专栏  ›  技术社区  ›  PyCoderyout

os.replace的权限错误

  •  0
  • PyCoderyout  · 技术社区  · 3 年前

    使用操作系统库将文件替换为临时文件时出现权限错误。

    PermissionError: [WinError 5] Access is denied: 'C:\\Users\\User\\Documents\\newewenwekwe_proxies.txt.tmp' -> 'C:\\Users\\User\\Documents\\newewenwekwe_proxies.txt'
    

    密码

        os.replace(tempfile, filename)
    
    

    尝试重新启动我的笔记本电脑,关闭文件,以管理员身份运行pycharm,以管理员的身份运行cmd并运行脚本。附言:我的笔记本电脑上有管理员密码。

    1 回复  |  直到 3 年前
        1
  •  1
  •   CPlus    2 年前

    尝试 os.rename() 相反

    可以找到原因 here .

        2
  •  0
  •   dimo414    2 年前

    这个 WinError 5 不幸的是,这个消息非常通用,所以有很多不同的答案,更不幸的是我认为大多数(比如以管理员身份运行的建议)通常都是不相关的。你 不应该 需要以管理员身份运行才能读取、写入或替换您拥有的文件。

    那怎么回事?当然,有多种可能的原因,但需要考虑的一个值得注意的原因是,该文件已在另一个进程中打开,因此无法替换。以下是一个快速演示:

    PS> python3.8.exe
    Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os
    >>> import tempfile
    >>> dest=tempfile.NamedTemporaryFile(suffix="-dest", delete=False).name
    >>> os.replace(tempfile.NamedTemporaryFile(suffix="-tmp", delete=False).name, dest)
    >>> f = open(dest)
    >>> os.replace(tempfile.NamedTemporaryFile(suffix="-tmp", delete=False).name, dest)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    PermissionError: [WinError 5] Access is denied: 'tmpuau8nzjn-tmp' -> 'tmpq3lqearn-dest'
    

    我们打了一个 WinError 5 在打开(并保持打开)目标文件的句柄之后。与支持并发写入的Linux不同(句柄继续指向旧文件) Windows does not allow this by default .

    相信 这个 FileShare enum 可以被开启器用来允许并发写入,但我不确定如何正确地将这个API与Python一起使用。