Python os.makedirs和shutil.copyfile-错误13-权限被拒绝
在我的代码中,我创建了如下目录:Python os.makedirs和shutil.copyfile-错误13-权限被拒绝,python,windows,permissions,shutil,file-copying,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 th
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上运行,每个:
dst
必须是完整的目标文件名;查看shutil.copy()
以获取接受目标目录路径的副本
你不能用它来做你在shell中所做的事情,命名一个源文件和一个目标目录,并让它推断出该文件应该以文件的原始名称放在目录中。您必须显式命名目标文件,否则它会认为您正在尝试复制到与目录相同的名称,并且与替换文件不同,如果不显式重命名目录或先删除整个目录树,则无法将目录替换为文件。要修复此问题,请确保在源和目标中重复文件名:
for filename in ('ffmpeg.exe', 'ffplay.exe', 'ffprobe.exe'):
shutil.copyfile(filename, os.path.join(playlist_name, filename))
这个问题在类UNIX系统上更为明显,因为这些系统会使用
EISDIR
拒绝操作,从而引发PythonIsADirectoryError
,但Windows出于某种原因选择使用与权限/访问问题相关联的更通用的错误代码(EACCES
和相关的Windows特定错误代码),Python将其转换为PermissionError
(因为Windows只是没有告诉它真正的问题,如果Python试图检查真正的问题是否是试图使用目录作为文件来修复异常类型,它将引入各种竞争条件).错误告诉您问题所在,请确保您对执行脚本的帐户(可能是您的用户)具有权限。@user1767754:在经典的“您是否具有写入权限”模型中,这实际上不是权限错误;Windows使用该错误代码(或者在其他情况下是EPERM
,但仍然是PythonPermissionError
)当您尝试用文件覆盖目录或打开目录进行写入时,如果它是文件,则会出现此问题,因为您不被“允许”这样做。EISDIR
(PythonisDirectoryError
)这是您所期望的,但是Windows使用EACCES
/EPERM
,因为他们非常讨厌您。NtCreateFile
系统调用返回STATUS\u FILE\u is\u A\u DIRECTORY
。问题是Windows将此状态值映射到错误代码错误访问被拒绝
,这是古代遗留的行为(16位窗口)。如果它明确保证保留线程的最后一个NT状态值,那么Python只需调用RtlGetLastNtStatus
,就可以在这种情况下引发IsADirectoryError
。我知道我现在出了什么问题,有道理,它不喜欢我尝试用文件替换目录。对于循环也很好,我迟到了昨晚,我失去了所有的思路。谢谢。