python [WinError 5] 액세스가 거부되었습니다 에러 해결 방법
권한 오류: [WinError 5] 액세스가 거부되었습니다
임시 해결방법으로는 아래 쿠키/캐시파일 삭제하는 코딩을 "#" 처리해주면됨.
# try:
# shutil.rmtree(r"c:\chrometemp") #쿠키 / 캐쉬파일 삭제
# except FileNotFoundError:
# pass
Python은 강력하고 다재다능한 프로그래밍 언어이지만 숙련된 개발자라도 문제 해결이 어려울 수 있는 오류가 발생할 수 있습니다. Python에서 파일로 작업할 때 발생할 수 있는 가장 일반적인 오류 중 하나는 스크립트가 액세스 권한이 없는 파일 또는 디렉터리에 액세스하려고 할 때 발생하는 PermissionError입니다.
이 블로그 게시물에서는 Python에서 PermissionError에 대한 원인과 해결책, 특히 "PermissionError: [WinError 5] Access Denied" 오류 메시지에 대해 논의할 것입니다.
이 오류의 가장 일반적인 원인 중 하나는 다른 프로세스에서 현재 사용 중인 파일 또는 디렉터리를 삭제하려고 시도하는 것입니다. 예를 들어 다른 프로그램에서 열려 있는 파일을 삭제하려고 하면 사용 권한 오류가 표시됩니다. 이는 운영 체제에서 현재 사용 중인 파일을 삭제할 수 없기 때문입니다.
이 오류의 또 다른 일반적인 원인은 스크립트가 액세스하는 데 필요한 권한이 없는 파일 또는 디렉터리에 액세스하려고 시도하는 것입니다. 예를 들어 스크립트가 시스템의 루트 디렉터리에 있는 파일 또는 디렉터리에 액세스하려고 하지만 스크립트가 관리자 권한으로 실행되고 있지 않으면 사용 권한 오류가 발생합니다.
이 문제를 해결하려면 파일이 다른 프로세스에 의해 열려 있는지 또는 스크립트가 파일 또는 디렉터리에 액세스하는 데 필요한 권한을 가지고 있는지 확인해야 합니다. 파일이 다른 프로세스에 의해 열려 있는지 확인하기 위해 python psutil 라이브러리를 사용할 수 있습니다. 다음은 psutil 라이브러리를 사용하여 파일이 다른 프로세스에 의해 열려 있는지 확인하는 방법의 예입니다:
에러 원인
이 오류 메시지는 Python 스크립트가 "c:\chrometemp"에 있는 파일 또는 디렉터리를 삭제하려고 하지만 권한 오류로 인해 삭제할 수 없음을 나타냅니다. 스크립트에 파일 또는 디렉터리를 삭제하는 데 필요한 권한이 없기 때문에 발생할 수 있습니다. 한 가지 해결책은 관리자로서 스크립트를 실행하는 것입니다. 관리자는 스크립트에 파일 또는 디렉터리를 삭제하는 데 필요한 권한을 부여해야 합니다. 스크립트 또는 스크립트를 실행하는 사용자에게 운영 체제에서 권한을 수정하여 파일 또는 디렉터리를 삭제할 수 있는 권한을 수동으로 부여하는 것도 다른 옵션입니다. 이 경우 스크립트는 'c:\chrometemp\Default\optimization_guide_prediction_model_downloads\26510c11-4c41-4c32-ae82-d3693fb4c33c\model.tflite' 디렉터리의 파일을 삭제하려고 합니다. python psutil 라이브러리를 사용하여 파일이 다른 프로세스에 의해 열려 있는지 확인하고 삭제하기 전에 파일을 닫을 수 있습니다.
python 코딩 방법
python psutil 라이브러리를 사용하여 파일이 다른 프로세스에 의해 열려 있는지 확인하고 파일을 삭제하기 전에 파일 닫는 파이썬 코딩이 필요함. psutil 라이브러리는 psutil.process_iter() 함수를 사용하여 실행 중인 모든 프로세스를 반복한 다음 각 프로세스의 open_files() 메서드를 확인하여 해당 파일이 열려 있는지 확인하는 데 사용할 수 있습니다. 다음은 이 작업을 수행하는 방법의 예입니다:
import psutil
def is_file_open(file_path):
for proc in psutil.process_iter():
try:
for item in proc.open_files():
if file_path == item.path:
return True
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass
return False
file_path = "c:/chrometemp/Default/optimization_guide_prediction_model_downloads/26510c11-4c41-4c32-ae82-d3693fb4c33c/model.tflite"
if is_file_open(file_path):
print("File is open by another process. Close the file before deleting it.")
process_id = [p.info for p in psutil.process_iter(['pid','name','exe']) if file_path in [f.path for f in p.open_files()]][0]['pid']
process = psutil.Process(process_id)
process.terminate()
else:
print("file is not open.")
#Delete the file here
이 코드는 파일이 열려 있는지 확인하고, 열려 있으면 파일 경로를 사용하여 프로세스 ID를 가져오고 프로세스를 사용하여 프로세스를 종료합니다. terminate 이후에는 파일을 삭제할 수 있습니다. 프로세스를 종료하면 저장되지 않은 데이터가 손실될 수 있으므로 주의하여 이 방법을 사용해야됨.
import psutil
# Replace "file_path" with the path of the file you want to check
file_path = "c:\chrometemp\Default\optimization_guide_prediction_model_downloads\26510c11-4c41-4c32-ae82-d3693fb4c33c\model.tflite"
# Check if the file is open by another process
for proc in psutil.process_iter():
try:
open_files = proc.open_files()
for open_file in open_files:
if open_file.path == file_path:
print(f"The file is open by process: {proc.name()} (pid: {proc.pid})")
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass
파일이 다른 프로세스에 의해 열려 있으면 현재 파일을 사용 중인 프로세스의 프로세스 이름과 프로세스 ID가 표시됩니다현재 파일을 사용 중인 프로세스를 확인한 후 파일을 삭제하기 전에 닫을 수 있습니다. 한 가지 방법은 명령 프롬프트에서 taskkill 명령을 사용하는 것입니다. 프로세스 ID를 사용하여 프로세스를 닫을 수 있습니다.
import subprocess
# Replace "pid" with the process id of the process you want to close
pid = 1234
# Close the process
subprocess.run(["taskkill", "/pid", str(pid), "/f"])
또는 os 모듈을 사용하여 파일을 삭제하기 전에 파일을 닫을 수 있습니다. 프로그램에 다른 문제가 발생할 수 있으므로 파일을 닫거나 프로세스를 죽이는 것이 항상 최선의 해결책은 아닙니다. 따라서 변경 사항을 구현하기 전에 코드를 철저히 테스트하는 것이 항상 좋습니다.
결론적으로 PermissionError는 Python으로 작업할 때 발생할 수 있는 일반적인 오류입니다. 파일 또는 디렉터리가 다른 프로세스에서 사용되고 있기 때문에 발생합니다. psutil 라이브러리를 사용하면 파일을 사용하는 프로세스를 식별하고 파일을 삭제하기 전에 닫을 수 있습니다. 원인과 해결책을 제대로 이해하면 이제 PermissionError를 피하고 파이썬 프로젝트를 원활하게 진행할 수 있습니다.
import os
file_path = r"c:\chrometemp\Default\optimization_guide_prediction_model_downloads\26510c11-4c41-4c32-ae82-d3693fb4c33c\model.tflite"
try:
os.remove(file_path)
except PermissionError:
os.close(file_path)
os.remove(file_path)
댓글