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.
- Lopend als beheerder van
cmd.exe
- Een snelkoppeling maken om het bestand met verhoogde rechten uit te voeren
- 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:
-
Handmatig
- Zoek
cmd.exe
inC:\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
- Zoek
-
Via sneltoetsen
- Druk op de Windows-toets (meestal tussen
alt
enctrl
) +X
. - Er verschijnt een kleine pop-uplijst met verschillende beheerderstaken.
- Selecteer
Command Prompt (Admin)
- Reis naar je projectdirectory
- Voer je programma uit
- Druk op de Windows-toets (meestal tussen
Als u dat doet, werkt u als beheerder, dus dit probleem zou niet moeten blijven bestaan
2) Snelkoppeling maken met verhoogde rechten
- Maak een snelkoppeling voor
python.exe
- Klik met de rechtermuisknop op de snelkoppeling en selecteer
Properties
- Verander het doel van de snelkoppeling in iets als
"C:\path_to\python.exe" C:\path_to\your_script.py"
- 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))