2017-12-01 124 views
0

, 나는 디렉토리과 같이 생성 거부 :파이썬 os.makedirs 및 shutil.copyfile - - 오류 13 권한 내 코드에서

내 파이썬 스크립트를 실행 장소에 디렉토리를 생성
try: 
    os.makedirs(playlist_name) 
except OSError as e: 
    if e.errno != errno.EEXIST: 
     raise 

.

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

: 은 그럼 그 파일을 복사하려고하지만 너무

# 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 + "/") 

처럼 폴더가 새로 생성 된 디렉토리에있는 원래의 디렉토리에서 세 개의 파일을 복사 할하면이 오류가 발생합니다 나는 같은 오류와 함께 다양한 shutil 복사 방법을 시도했다.

편집 :이 창

the copyfile docs
+0

이 오류는 문제가 무엇인지 알려주고 스크립트를 실행하는 계정 (아마도 사용자)에게 권한이 있는지 확인하십시오. – user1767754

+0

@ user1767754 : "쓰기 권한이 있습니까?"라는 클래식 모델의 사용 권한 오류가 아닙니다. Windows는 파일로 디렉토리를 덮어 쓰거나 디렉토리를 파일로 작성하려고 할 때 오류 코드 (또는 다른 경우에는 'EPERM'이지만 여전히 Python'PermissionError')를 사용합니다.이 경우 문제 왜냐하면 당신이 그렇게 할 수는 없기 때문입니다. 'EISDIR' (Python'IsADirectoryError')는 기대했던 것입니다 만, Windows는'EACCES' /'EPERM'을 사용합니다. 왜냐하면 그들은 당신을 몹시 싫어하기 때문입니다. – ShadowRanger

답변

1

에서 실행되는 :

dst must be the complete target file name; look at shutil.copy() for a copy that accepts a target directory path.

당신은 소스 파일과 대상 디렉토리의 이름을 지정하고 필요, 쉘에 당신이 할 일을하는 데 사용할 수 없습니다 그것은 파일이 파일의 원래 이름으로 디렉토리에 저장되어야한다고 추론합니다. 명시 적으로 대상 파일의 이름을 지정하거나 디렉토리와 동일한 이름으로 복사하려고한다고 생각하면 파일을 바꾸는 것과 달리 명시 적으로 디렉토리의 이름을 바꾸거나 디렉토리를 삭제하지 않고 디렉토리를 파일로 바꿀 수는 없습니다. 먼저 전체 디렉토리 트리. 해결하려면, 단지 소스 및 대상에 파일 이름을 반복해야합니다 :

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

이러한 시스템은 파이썬의 원인이 EISDIR으로 작업을 거부 때문에 문제는 유닉스 계열 시스템에 대한 자세한 명백 할 것이다 IsADirectoryError이 발생하지만 Windows는 어떤 이유에서든 Windows가 실제 문제를 말하지 않기 때문에 어떤 이유 때문에 Windows가 특정 문제 (EACCES 및 관련 Windows 관련 오류 코드)와 관련된보다 일반적인 오류 코드를 사용하여 PermissionError으로 변환합니다. Python이 실제 문제가 디렉토리를 파일로 사용하여 예외 유형을 수정하려고 시도했는지 확인하려고 시도하면 모든 종류의 경쟁 조건이 발생합니다.

+1

'NtCreateFile' 시스템 콜은'STATUS_FILE_IS_A_DIRECTORY'를 리턴합니다. 문제는 Windows에서이 상태 값을 고대 (16 비트 Windows)의 레거시 동작 인 오류 코드 'ERROR_ACCESS_DENIED'에 매핑합니다. 쓰레드의 마지막 NT 상태 값의 보존을 명시 적으로 보장한다면 Python은이 경우에'IsADirectoryError'를 발생시킬 수 있도록 단순히'RtlGetLastNtStatus'를 호출 할 수 있습니다. – eryksun

+0

내가 지금 잘못 가고있는 곳을보고, 내가 파일을 가지고 디렉토리를 바꾸려고하지 않는 것 같아. 어제도 늦었어요. 나는 모든 생각을 잃어 버렸습니다. 감사. – speedcucumber