Bug in os.access() unter Windows? [Bestätigt]

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ich arbeite unter Windows nicht mit Administratorrechten. Also habe ich keinen Schreibzugriff auf das Laufwerk 'C:'. Wenn ich dort versuchen würde, eine Datei hinzukopieren, bringt mir Windows sofort eine Fehlermeldung. Alles korrekt soweit.

Nun möchte ich mit Python versuchen auf 'C:' zu schreiben. Bevor ich loslege, möchte ich aber erstmal prüfen, ob der Pfad schreibbar ist. Als Pfad verwende ich 'C:' und als Dateiname 'test.txt'. Ich habe die Erfahrung gemacht, dass es gerade unter Windows manchmal erforderlich ist, Pfadangaben immer mit abschließendem Backslash zu verwenden. Bei reinen Laufwerksbuchstaben wie 'C:' kann es sonst Probleme geben.

Lange Rede, kurzer Sinn: Wieso verhält sich das folgende Script so wie es sich verhält?

Code: Alles auswählen

import os
path = "C:"
file = "test.txt"
# enforce trailing slash on the path
if len(path) > 0 and not path.endswith(os.path.sep):
	path += os.path.sep
# check if path is writeable
if os.access(path, os.W_OK):
	print "'%s' is writeable" % path
	write = path+file
	print "try to write '%s'" % write
	f = open(write, "w")
	f.writeline("test")
else:
	print "'%s' doesn't exist or not writeable" % path
Heraus kommt:
Python Interpreter hat geschrieben:'C:\' is writeable
try to write 'C:\test.txt'
Traceback (most recent call last):
File "bug_os.access.py", line 12, in ?
f = open(write, "w")
IOError: [Errno 13] Permission denied: 'C:\\test.txt'
Zuletzt geändert von droptix am Freitag 29. September 2006, 16:46, insgesamt 2-mal geändert.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Du hast keine rechte das File im schreibmodus zu öffnen.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

droptix hat geschrieben:...Pfadangaben immer mit abschließendem Backslash zu verwenden.
Hi droptix!

Unabhängig von deinem eigentlichen Problem, möchte ich nur mal so zwischendurch ein paar Codezeilen rein werfen.

Code: Alles auswählen

>>> import os
>>> import os.path
>>> os.path.abspath("C:")
'c:\\'
>>> os.path.abspath("C:\")
'C:\\'
>>> os.path.join(os.path.abspath("C:"), "hallo")
'c:\\hallo'
>>> 
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

DatenMetzgerX hat geschrieben:Du hast keine rechte das File im schreibmodus zu öffnen.
Richtig! Aber wieso erkennt das os.access(path, os.W_OK) dann nicht korrekt? Einen kleinen Unterschied gibt es zwar noch zu bedenken: os.access() prüft hier schließlich nur den Pfad und nicht die Datei, weil die ja erst noch erstellt werden soll. Macht das einen wesentlichen Unterschied?

@gerold: Danke für den Tipp. Obwohl das mein Problem nicht einkreist oder löst 8)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi droptix!

Du hast recht -- irgendetwas stimmt da nicht. Ich habe mir soeben alle Rechte für die Datei "J:\\Ablage\\bitmaps\\andrea1.jpg" genommen. Die Datei ist zwar noch sichtbar, aber ich darf sie nicht lesen. Trotzdem liefert mir mein unten aufgezeigter Test jedes Mal ein True zurück.

Code: Alles auswählen

>>> import os
>>> import os.path
>>> os.access("J:\\Ablage\\bitmaps\\andrea1.jpg", os.R_OK)
True
>>> os.access("J:\\Ablage\\bitmaps\\andrea1.jpg", os.W_OK)
True
>>> os.access("J:\\Ablage\\bitmaps\\andrea1.jpg", os.X_OK)
True
>>>
Damit wurde soeben ``os.access`` unter Windows von der Liste der nützlichen Befehle gestrichen.

Fazit: try...except -- obwohl das umständlicher als eine einfache vorherige Anfrage mit ``os.access`` ist. :x

Vielleicht kann es ja jemand erklären oder vielleicht funktioniert ``os.access`` ja sogar schon mit Python 2.5 so wie man (=ich) es erwartet...

mfg
Gerold
:-)

PS: Du überschreibst ``file``.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Hum, jetzt würde mich natürlich auch noch interessieren, ob dieser Bug in Python 2.5 behoben wurde. Danke für's fixe Recherchieren.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Man muss sich nur den Link zu SF ansehen. Da sieht man dann, dass der Status "Closed"-"Fixed" ist, also ist das Problem behoben. Und zwar im Juli, also vor 2.5.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

birkenfeld hat geschrieben:Man muss sich nur den Link zu SF ansehen. Da sieht man dann, dass der Status "Closed"-"Fixed" ist, also ist das Problem behoben. Und zwar im Juli, also vor 2.5.
Dort bezieht man sich aber ausschließlich auf:
SourceForge hat geschrieben:Summary:
os.access reports incorrect write permissions in Windows
Platform: Python 2.5b1 Windows XP
Es ging also um Bugs in der Beta-Version vor Veröffentlichung. Nicht um Version 2.4. Ich denke der Bug ist in Python 2.4 noch drin.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Es ging dir doch um 2.5, oder?

Außerdem, aus den Comments zum Bugreport:
"Does this problem only occur with 2.5 or is it also present
in 2.4?"

"Yeah, it's only 2.5, and only 2.5b1. Basically,
there's a
double ampersand used instead of a single ampersand in
posixmodule.c. I've attached the patch."
Es ist also eher nicht der Bug, den du beobachtest.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Anfangs ging es mir um Python 2.4, da ich es derzeit noch nutze. Aber da die 2.5er Version frisch raus ist, könnte ich mir auch vorstellen, einfach auf 2.5 auszuweichen, wenn das den Fehler behebt.

Nein, es nicht nicht ganz der Bug den ich beobachte. Ich habe es ja eigentlich auch genau umgekehrt versucht: Pythons os.access() sagt "du darfst schreiben", obwohl ich nicht darf. Der bei SF gemeldete Bug sagt ja eher das Gegenteil: "du darfst nicht schreiben", obwohl Python darf.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Also stimmt's: Da gibt's definitiv nen Bug.
Antworten