PermissionError: [Errno 13] Permiso denegado
Recibo este error:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python34\lib\tkinter\__init__.py", line 1538, in __call__
return self.func(*args)
File "C:/Users/Marc/Documents/Programmation/Python/Llamachat/Llamachat/Llamachat.py", line 32, in download
with open(place_to_save, 'wb') as file:
PermissionError: [Errno 13] Permission denied: '/goodbye.txt'
Al ejecutar esto:
def download():
# get selected line index
index = films_list.curselection()[0]
# get the line's text
selected_text = films_list.get(index)
directory = filedialog.askdirectory(parent=root,
title="Choose where to save your movie")
place_to_save = directory + '/' + selected_text
print(directory, selected_text, place_to_save)
with open(place_to_save, 'wb') as file:
connect.retrbinary('RETR ' + selected_text, file.write)
tk.messagebox.showwarning('File downloaded',
'Your movie has been successfully downloaded!'
'\nAnd saved where you asked us to save it!!')
¿Alguien puede decirme qué estoy haciendo mal?
Especificaciones: Python 3.4.4 x86 Windows 10 x64
Esto sucede si estás intentando abrir un archivo, pero tu ruta es una carpeta .
Esto puede suceder fácilmente por error.
Para defenderse de eso, utilice:
import os
path = r"my/path/to/file.txt"
assert os.path.isfile(path)
with open(path, "r") as f:
pass
La afirmación fallará si la ruta es realmente de una carpeta.
Primero asegúrese de que el archivo que está intentando escribir esté cerrado.
Básicamente, existen tres métodos principales para lograr execution
privilegios de administrador en Windows.
- Ejecutando como administrador desde
cmd.exe
- Crear un acceso directo para ejecutar el archivo con privilegios elevados
- Cambiar los permisos en el
python
ejecutable (No recomendado)
A) Ejecutando cmd.exe
como administrador
Como en Windows no existe ningún sudo
comando, debe ejecutar la terminal ( cmd.exe
) como administrador para alcanzar un nivel de permisos equivalente a sudo
. Puedes hacer esto de dos maneras:
A mano
- Encontrar
cmd.exe
enC:\Windows\system32
- Haga clic derecho sobre él
- Seleccionar
Run as Administrator
- Luego abrirá el símbolo del sistema en el directorio.
C:\Windows\system32
- Viaja al directorio de tu proyecto
- Ejecute su programa
- Encontrar
A través de atajos de teclas
- Presione la tecla de Windows (entre
alt
yctrl
normalmente) +X
. - Aparecerá una pequeña lista emergente que contiene varias tareas de administrador.
- Seleccionar
Command Prompt (Admin)
- Viaja al directorio de tu proyecto
- Ejecute su programa
- Presione la tecla de Windows (entre
Al hacer esto, se está ejecutando como administrador, por lo que este problema no debería persistir.
B) Crear acceso directo con privilegios elevados
- Crear un acceso directo para
python.exe
- Haga clic derecho en el acceso directo y seleccione
Properties
- Cambie el destino del acceso directo a algo como
"C:\path_to\python.exe" C:\path_to\your_script.py"
- Haga clic en "avanzado" en el panel de propiedades del acceso directo y haga clic en la opción "ejecutar como administrador"
Respuesta aportada por delphifirst en esta pregunta.
C) Cambiar los permisos del python
ejecutable (No recomendado)
Esta es una posibilidad, pero le desaconsejo encarecidamente que lo haga.
Simplemente implica encontrar el python
ejecutable y configurarlo para que se ejecute como administrador cada vez. Puede y probablemente causará problemas con cosas como la creación de archivos (serán solo administradores) o posiblemente módulos que NO requieran ser administrador para ejecutarse.
Cambie los permisos del directorio en el que desea guardar para que todos los usuarios tengan permisos de lectura y escritura.
En mi caso, el problema fue que oculté el archivo (el archivo tenía un atributo oculto):
Cómo solucionar el problema en Python:
Editar: resalte los métodos inseguros, gracias d33tah
# Use the method nr 1, nr 2 is vulnerable
# 1
# and just to let you know there is also this way
# so you don't need to import os
import subprocess
subprocess.check_call(["attrib", "-H", _path])
# Below one is unsafe meaning that if you don't control the filePath variable
# there is a possibility to make it so that a malicious code would be executed
import os
# This is how to hide the file
os.system(f"attrib +h {filePath}")
file_ = open(filePath, "wb")
>>> PermissionError <<<
# and this is how to show it again making the file writable again:
os.system(f"attrib -h {filePath}")
file_ = open(filePath, "wb")
# This works