Python os.makedirs和shutil.copyfile - 错误13 - 权限被拒绝

时间:2017-12-01 02:16:41

标签: python windows permissions shutil file-copying

在我的代码中,我创建了一个如下目录:

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上运行

1 个答案:

答案 0 :(得分: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转换为EACCES的权限/访问问题(PermissionError和相关的Windows特定错误代码)相关联的更一般的错误代码(因为Windows并没有告诉它真正的问题,它会引入所有如果Python试图检查真正的问题是否试图使用目录作为文件来修复异常类型,那么各种竞争条件。)