web-dev-qa-db-fra.com

PermissionError: [Errno 13] Autorisation refusée

Je reçois cette erreur:

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'

Lorsque vous exécutez ceci:

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!!')

Quelqu'un peut-il me dire ce que je fais mal? Merci

Spécifications: Python 3.4.4 x86Windows 10 x64

8
Marc Schmitt

Modifiez les autorisations du répertoire dans lequel vous souhaitez enregistrer afin que tous les utilisateurs disposent des autorisations de lecture et d'écriture.

7
dione llorera

MODIFIER

Je constate un peu d’activité dans ma réponse et j’ai donc décidé de l’améliorer un peu pour ceux qui ont encore ce problème.

Il existe essentiellement trois méthodes principales pour obtenir les privilèges d'administrateur execution sous Windows.

  1. Exécuter en tant qu'administrateur à partir de cmd.exe 
  2. Création d'un raccourci pour exécuter le fichier avec des privilèges élevés
  3. Modification des autorisations sur l'exécutable python (non recommandé)

1) Lancer cmd.exe en tant que et admin

Étant donné que dans Windows, il n’existe pas de commande Sudo, vous devez exécuter le terminal (cmd.exe) en tant qu’administrateur pour obtenir un niveau de permissions équivalent à Sudo. Vous pouvez le faire de deux manières:

  1. Manuellement

    • Trouver cmd.exe dans C:\Windows\system32
    • Faites un clic droit dessus
    • Sélectionnez Run as Administrator
    • Il ouvrira ensuite la commande Invite dans le répertoire C:\Windows\system32
    • Accédez à votre répertoire de projet
    • Exécutez votre programme
  2. Via les raccourcis clavier

    • Appuyez sur la touche Windows (entre alt et ctrl généralement) + X.
    • Une petite liste déroulante contenant diverses tâches d’administrateur apparaîtra.
    • Sélectionnez Command Prompt (Admin) 
    • Accédez à votre répertoire de projet
    • Exécutez votre programme

En faisant cela, vous exécutez en tant qu'administrateur, ce problème ne devrait donc pas persister

2) Créer un raccourci avec des privilèges élevés

  1. Créer un raccourci pour python.exe
  2. Cliquez avec le bouton droit sur le raccourci et sélectionnez Properties
  3. Changez la cible du raccourci en quelque chose comme "C:\path_to\python.exe" C:\path_to\your_script.py"
  4. Cliquez sur "Avancé" dans le panneau de propriétés du raccourci, puis cliquez sur l'option "Exécuter en tant qu'administrateur".

Réponse fournie par delphifirst dans cette question

3) Modification des autorisations sur l'exécutable python (Non recommandé)

C'est une possibilité, mais je vous décourage vivement de le faire.

Cela implique simplement de trouver l'exécutable python et de le configurer pour qu'il s'exécute en tant qu'administrateur à chaque fois. Peut et va probablement causer des problèmes avec des choses telles que la création de fichiers (uniquement des administrateurs) ou éventuellement des modules ne nécessitant PAS d'être un administrateur pour s'exécuter.

7
Mixone

Cela m'est arrivé sur une machine Windows utilisant Pycharm.

Le correctif: Cliquez avec le bouton droit sur votre application PyCharm et exécutez-la en tant qu'administrateur.

3
Emmanuel

Le problème ici est que votre utilisateur ne dispose pas de droits/autorisations pour ouvrir le fichier. Cela signifie que vous devez accorder des privilèges administratifs à votre ide python avant d'exécuter cette commande.

En tant qu'utilisateur Windows, il vous suffit de cliquer avec le bouton droit de la souris sur python ide => sélectionner l'option 'Exécuter en tant qu'administrateur', puis exécuter votre commande.

Et si vous utilisez la ligne de commande pour exécuter les codes, procédez de la même façon ouvrez la commande Invite avec droits d’administrateur.

1
Gaurav Shrivastava

J'ai fait face à un problème similaire. J'utilise Anaconda sur Windows et je l'ai résolu comme suit: 1) recherchez "Anaconda Prompt" dans le menu Démarrer 2) Faites un clic droit et sélectionnez "Exécuter en tant qu'administrateur". étapes d'installation ...

Cela prend en charge les problèmes de permission

0
Chinnappa Reddy

Assurez-vous que le fichier que vous essayez d'écrire est fermé en premier.

0
Chrono Hax

Vérifiez et assurez-vous que le fichier que vous essayez d'écrire n'est pas ouvert ou qu'un programme en arrière-plan ne conserve pas ce fichier/ces données. C'était le problème pour moi.

0
aek8

Le problème pourrait être dans le chemin du fichier que vous voulez ouvrir. Essayez d’imprimer le chemin et de voir s’il est correct .__J'ai eu un problème similaire

def scrap(soup,filenm):
htm=(soup.prettify().replace("https://","")).replace("http://","")
if ".php" in filenm or ".aspx" in filenm or ".jsp" in filenm:
    filenm=filenm.split("?")[0]
    filenm=("{}.html").format(filenm)
    print("Converted a  file into html that was not compatible")

if ".aspx" in htm:
    htm=htm.replace(".aspx",".aspx.html")
    print("[process]...conversion fron aspx")
if ".jsp" in htm:
    htm=htm.replace(".jsp",".jsp.html")
    print("[process]..conversion from jsp")
if ".php" in htm:
    htm=htm.replace(".php",".php.html")
    print("[process]..conversion from php")

output=open("data/"+filenm,"w",encoding="utf-8")
output.write(htm)
output.close()
print("{} bits of data written".format(len(htm)))

mais après avoir ajouté ce code:

nofilenametxt=filenm.split('/')
nofilenametxt=nofilenametxt[len(nofilenametxt)-1]
if (len(nofilenametxt)==0):
    filenm=("{}index.html").format(filenm)

Cela a fonctionné parfaitement

0
oyamo brian