PermissionError: [Errno 13] Permiso denegado

Resuelto Marc Schmitt asked hace 8 años • 0 respuestas

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

Marc Schmitt avatar Apr 06 '16 01:04 Marc Schmitt
Aceptado

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.

Gulzar avatar Jun 07 '2020 11:06 Gulzar

Primero asegúrese de que el archivo que está intentando escribir esté cerrado.

Chrono Hax avatar Feb 07 '2019 03:02 Chrono Hax

Básicamente, existen tres métodos principales para lograr executionprivilegios de administrador en Windows.

  1. Ejecutando como administrador desdecmd.exe
  2. Crear un acceso directo para ejecutar el archivo con privilegios elevados
  3. Cambiar los permisos en el pythonejecutable (No recomendado)

A) Ejecutando cmd.execomo administrador

Como en Windows no existe ningún sudocomando, debe ejecutar la terminal ( cmd.exe) como administrador para alcanzar un nivel de permisos equivalente a sudo. Puedes hacer esto de dos maneras:

  1. A mano

    • Encontrar cmd.exeenC:\Windows\system32
    • Haga clic derecho sobre él
    • SeleccionarRun as Administrator
    • Luego abrirá el símbolo del sistema en el directorio.C:\Windows\system32
    • Viaja al directorio de tu proyecto
    • Ejecute su programa
  2. A través de atajos de teclas

    • Presione la tecla de Windows (entre alty ctrlnormalmente) + X.
    • Aparecerá una pequeña lista emergente que contiene varias tareas de administrador.
    • SeleccionarCommand Prompt (Admin)
    • Viaja al directorio de tu proyecto
    • Ejecute su programa

Al hacer esto, se está ejecutando como administrador, por lo que este problema no debería persistir.

B) Crear acceso directo con privilegios elevados

  1. Crear un acceso directo parapython.exe
  2. Haga clic derecho en el acceso directo y seleccioneProperties
  3. Cambie el destino del acceso directo a algo como"C:\path_to\python.exe" C:\path_to\your_script.py"
  4. 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 pythonejecutable (No recomendado)

Esta es una posibilidad, pero le desaconsejo encarecidamente que lo haga.

Simplemente implica encontrar el pythonejecutable 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.

Mixone avatar Apr 07 '2016 07:04 Mixone

Cambie los permisos del directorio en el que desea guardar para que todos los usuarios tengan permisos de lectura y escritura.

dione llorera avatar Apr 07 '2016 07:04 dione llorera

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

Kacper Kwaśny avatar Jul 22 '2020 21:07 Kacper Kwaśny