PermissionError: [Errno 13] Toestemming geweigerd

Ik krijg deze foutmelding:

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'

Als je dit uitvoert:

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

Kan iemand me vertellen wat ik verkeerd doe?

Specificaties:
Python 3.4.4 x86
Windows 10 x64


Antwoord 1, autoriteit 100%

Dit gebeurt als u probeert een bestand te openen, maar uw pad is een map.

Dit kan gemakkelijk per ongeluk gebeuren.

Om je daartegen te verdedigen, gebruik:

import os
path = r"my/path/to/file.txt"
assert os.path.isfile(path)
with open(path, "r") as f:
    pass

De bewering zal mislukken als het pad daadwerkelijk van een map is.


Antwoord 2, autoriteit 79%

BEWERKEN

Ik zie een beetje activiteit op mijn antwoord, dus ik besloot het een beetje te verbeteren voor degenen die dit probleem nog steeds hebben

Er zijn in principe drie hoofdmethoden om beheerdersrechten voor execution op Windows te verkrijgen.

  1. Lopend als beheerder van cmd.exe
  2. Een snelkoppeling maken om het bestand met verhoogde rechten uit te voeren
  3. De machtigingen voor het uitvoerbare bestand python wijzigen (niet aanbevolen)

1) cmd.exe uitvoeren als en admin

Aangezien er in Windows geen sudo-opdracht is, moet u de terminal (cmd.exe) als beheerder uitvoeren om het machtigingsniveau te bereiken dat gelijk is aan sudo. U kunt dit op twee manieren doen:

  1. Handmatig

    • Zoek cmd.exe in C:\Windows\system32
    • Klik er met de rechtermuisknop op
    • Selecteer Run as Administrator
    • Het zal dan de opdrachtprompt openen in de directory C:\Windows\system32
    • Reis naar je projectdirectory
    • Voer je programma uit
  2. Via sneltoetsen

    • Druk op de Windows-toets (meestal tussen alt en ctrl) + X.
    • Er verschijnt een kleine pop-uplijst met verschillende beheerderstaken.
    • Selecteer Command Prompt (Admin)
    • Reis naar je projectdirectory
    • Voer je programma uit

Als u dat doet, werkt u als beheerder, dus dit probleem zou niet moeten blijven bestaan

2) Snelkoppeling maken met verhoogde rechten

  1. Maak een snelkoppeling voor python.exe
  2. Klik met de rechtermuisknop op de snelkoppeling en selecteer Properties
  3. Verander het doel van de snelkoppeling in iets als "C:\path_to\python.exe" C:\path_to\your_script.py"
  4. Klik op “geavanceerd” in het eigenschappenvenster van de snelkoppeling en klik op de optie “uitvoeren als beheerder”

Antwoord bijgedragen door delphifirst in deze vraag

3) De rechten op het uitvoerbare bestand python wijzigen (niet aanbevolen)

Dit is een mogelijkheid, maar ik raad u ten zeerste af om dit te doen.

Het gaat alleen om het vinden van het uitvoerbare bestand python en het instellen om elke keer als beheerder te worden uitgevoerd. Kan en zal waarschijnlijk problemen veroorzaken met zaken als het maken van bestanden (ze zijn alleen admin) of mogelijk modules waarvoor GEEN beheerder hoeft te worden uitgevoerd.


Antwoord 3, autoriteit 26%

Zorg ervoor dat het bestand dat u probeert te schrijven eerst wordt gesloten.


Antwoord 4, autoriteit 19%

Wijzig de machtigingen van de map waarin u wilt opslaan, zodat alle gebruikers lees- en schrijfmachtigingen hebben.


Antwoord 5, autoriteit 7%

U kunt CMD als beheerder uitvoeren en de machtiging van de map wijzigen met cacls.exe. Bijvoorbeeld:

cacls.exe c: /t /e /g everyone:F # means everyone can totally control the C: disc

Antwoord 6, autoriteit 5%

Het probleem kan liggen in het pad van het bestand dat u wilt openen. Probeer het pad af te drukken en kijk of het in orde is
Ik had een soortgelijk probleem

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

maar na het toevoegen van deze code:

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

Antwoord 7, autoriteit 2%

Ik had een soortgelijk probleem. Ik dacht dat het misschien aan het systeem lag. Maar het gebruik van shutil.copytree() uit de shutil module loste het probleem voor mij op!


Antwoord 8, autoriteit 2%

In mijn geval was het probleem dat ik het bestand verborg (het bestand had een verborgen kenmerk):
Hoe om te gaan met het probleem in python:

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
# 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])

Antwoord 9

Ik had een soortgelijk probleem. Ik gebruik Anaconda op Windows en ik heb het als volgt opgelost:
1) zoek naar “Anaconda prompt” in het startmenu
2) Klik met de rechtermuisknop en selecteer “Als administrator uitvoeren”
3) Volg de installatiestappen…

Dit lost de toestemmingsproblemen op


Antwoord 10

in mijn geval. ik maak gewoon de map .idlerc verborgen.
dus ik hoefde alleen maar naar die map te gaan en recent-files.lst daarna zichtbaar te maken, het probleem was opgelost


Antwoord 11

Dit is hoe ik de fout ben tegengekomen:

import os
path = input("Input file path: ")
name, ext = os.path.basename(path).rsplit('.', 1)
dire = os.path.dirname(path)
with open(f"{dire}\\{name} temp.{ext}", 'wb') as file:
    pass

Het werkt prima als de gebruiker een bestandspad invoert met meer dan één element, zoals

C:\\Users\\Name\\Desktop\\Folder

Maar ik dacht dat het zou werken met een invoer als

file.txt

zolang file.txt zich in dezelfde map van het python-bestand bevindt. Maar nee, het gaf me die fout, en ik realiseerde me dat de juiste invoer had moeten zijn

.\\file.txt

Antwoord 12

Zoals @gulzar al zei, had ik het probleem om een ​​bestand 'abc.txt' te schrijven in mijn python-script dat zich in Z:\project\test.py:

with open('abc.txt', 'w') as file:
    file.write("TEST123")

Elke keer dat ik een script uitvoerde, wilde het in feite een bestand maken in mijn C-schijf in plaats van Z!
Dus ik specificeerde alleen het volledige pad met bestandsnaam in:

with open('Z:\\project\\abc.txt', 'w') as file: ...

en het werkte prima. Ik hoefde geen toestemming toe te voegen of iets te veranderen in Windows.


Antwoord 13

Een andere optie die me heeft geholpen is het gebruik van pathlib:

from pathlib import Path
p = Path('.') ## if you want to write to current directory
with open(p / 'test.txt', 'w') as f:
    f.write('test message')

Antwoord 14

Deze fout treedt eigenlijk ook op bij het gebruik van keras.preprocessing.image dus bijvoorbeeld:

img = keras.preprocessing.image.load_img(folder_path, target_size=image_size)

zal de toestemmingsfout veroorzaken. Vreemd genoeg is het probleem echter opgelost als je eerst de bibliotheek importeert: from keras.preprocessing import image en pas daarna gebruikt. Vind ik leuk:

img = image.load_img(img_path, target_size=(180,180))

LEAVE A REPLY

Please enter your comment!
Please enter your name here

8 + three =

Other episodes