Seite 1 von 1

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

Verfasst: Mittwoch 27. September 2006, 21:20
von droptix
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'

Verfasst: Mittwoch 27. September 2006, 21:41
von DatenMetzgerX
Du hast keine rechte das File im schreibmodus zu öffnen.

Re: Bug in os.access() unter Windows?

Verfasst: Mittwoch 27. September 2006, 21:50
von gerold
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
:-)

Verfasst: Mittwoch 27. September 2006, 21:56
von droptix
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)

Verfasst: Mittwoch 27. September 2006, 22:11
von gerold
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``.

Verfasst: Mittwoch 27. September 2006, 23:04
von gerold

Auch noch on Python 2.5 buggy?

Verfasst: Mittwoch 27. September 2006, 23:58
von droptix
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.

Verfasst: Donnerstag 28. September 2006, 08:57
von birkenfeld
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.

Verfasst: Freitag 29. September 2006, 08:33
von droptix
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.

Verfasst: Freitag 29. September 2006, 08:41
von birkenfeld
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.

Es ging mir um Python 2.4

Verfasst: Freitag 29. September 2006, 10:18
von droptix
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.

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

Verfasst: Freitag 29. September 2006, 16:43
von droptix
Also stimmt's: Da gibt's definitiv nen Bug.