【问题标题】:Python os.makedirs and shutil.copyfile - Error 13 - Permission deniedPython os.makedirs 和 shutil.copyfile - 错误 13 - 权限被拒绝
【发布时间】:2018-05-15 02:30:06
【问题描述】:

在我的代码中,我创建了一个这样的目录:

try:
    os.makedirs(playlist_name)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

这会在我运行 python 脚本的地方创建一个目录。 然后我希望将文件夹所在的原始目录中的三个文件复制到新创建的目录中,像这样

# Copy FFMPEG files into that folder so youtube dl can download the videos as audio tracks
# Tried using os.getcwd() to get full path, same error
shutil.copyfile(os.getcwd() + '\\ffmpeg.exe', os.getcwd() + "\\" + playlist_name)
shutil.copyfile('ffplay.exe', "/" + playlist_name + "/")
shutil.copyfile('ffprobe.exe', "/" + playlist_name + "/")

但是,尝试复制这些文件会引发此错误:

PermissionError: [Errno 13] Permission denied: 'C:\\Users\\ME\\Documents\\python\\DIRECTORY\\PLAYLIST_NAME_HERE'

我尝试了各种shutil复制方法,都出现同样的错误。

编辑:这是在 Windows 上运行的

【问题讨论】:

  • 错误告诉你问题出在哪里,确保你有权限,使用执行脚本的帐户,可能是你的用户。
  • @user1767754:实际上并不是经典模型“你有写权限”的权限错误;当您尝试用文件覆盖目录或像打开文件一样打开目录进行写入时,Windows 会使用该错误代码(或在其他情况下为 EPERM,但仍然是 Python PermissionError),这种情况下的问题,因为你没有“被允许”这样做。 EISDIR (Python IsADirectoryError) 是你所期望的,但 Windows 使用 EACCES/EPERM 因为他们非常讨厌你。

标签: python windows permissions shutil file-copying


【解决方案1】:

the copyfile docs:

dst 必须是完整的目标文件名;查看shutil.copy() 以获取接受目标目录路径的副本。

你不能用它来做你在shell中做的事情,命名一个源文件和一个目标目录并让它推断出文件应该放在具有文件原始名称的目录中。您必须显式命名目标文件,否则它认为您正在尝试复制到与目录相同的名称,并且与替换文件不同,如果不显式重命名目录或删除文件,则无法用文件替换目录首先是整个目录树。要修复,只需确保在源和目标中重复文件名:

for filename in ('ffmpeg.exe', 'ffplay.exe', 'ffprobe.exe'):
    shutil.copyfile(filename, os.path.join(playlist_name, filename))

在类 UNIX 系统上问题会更加明显,因为这些系统会拒绝带有 EISDIR 的操作,从而引发 Python IsADirectoryError,但 Windows 出于某种原因选择使用更通用的错误代码与 Python 转换为 PermissionError 的权限/访问问题(EACCES 和相关的 Windows 特定错误代码)相关(因为 Windows 并没有告诉它真正的问题,如果 Python 试图这样做,它会引入各种竞争条件检查真正的问题是否是试图使用目录作为文件来修复异常类型)。

【讨论】:

  • NtCreateFile 系统调用返回STATUS_FILE_IS_A_DIRECTORY。问题是 Windows 将此状态值映射到错误代码 ERROR_ACCESS_DENIED,这是古代(16 位 Windows)的遗留行为。如果它明确保证保留线程的最后一个 NT 状态值,那么在这种情况下,Python 可以简单地调用RtlGetLastNtStatus 来引发IsADirectoryError
  • 我知道我现在哪里出错了,这是有道理的,它不喜欢我尝试用文件替换目录。循环也不错,昨晚很晚,我失去了所有的思路。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-07-19
  • 2017-04-04
  • 2013-01-25
  • 2020-02-07
  • 1970-01-01
  • 2017-04-20
  • 2021-05-18
相关资源
最近更新 更多