os.access(file, os.R_OK) on UNIX and WINDOWS

Tim Golden tim.golden at viacom-outdoor.co.uk
Wed Sep 13 09:29:09 EDT 2006


[kai rosenthal]

| on UNIX I changed the permission of a file "myfile" with chmod 000
| myfile. Then I got 0 from os.access(myfile, os.R_OK). This is ok.
| 
| Then I checked the same file on WINDOWS (with samba):
| I got "True" from os.access(myfile, os.R_OK). I think it is not ok?!

Ummm. This is a touch similar to a parallel thread about
os.X_OK on Win32. At the risk of being grilled by better-informed
types, the fact is that while the Win32 CRT (used for non-Unicode
operations by the Python os module) does expose chmod and
access functions, they don't seem guaranteed to do more than overlap
more-or-less with the corresponding Unix functions.

From what appears to be the MSDN page for chmod [1]:
"""
The permission setting controls read and write access to the file. 
The integer expression pmode contains one or both of the following 
manifest constants, defined in SYS\STAT.H:

_S_IWRITE - Writing permitted
_S_IREAD - Reading permitted
_S_IREAD | _S_IWRITE - Reading and writing permitted

Any other values for pmode are ignored. 
"""

Note that last sentence: I take this to mean that passing
zero to mean "can't read or write" is having no effect.

The latest Python source source [2] uses the Win32 API
SetFileAttributesW [3] where a Unicode filename is passed, 
but this doesn't seem to allow for a neither-read-nor-write
situation either.

| In my python script I check the return value of os.access(myfile,
| os.R_OK) and when it is "True" I copy the file with 
| shutil.copy(myfile, newfile).
| But on WINDOWS I get the error: IOError: [Errno 13] Permission denied.

I suspect you're going to have to put the copy in a
try... except block, which is not bad advice in any
case. If you check access and then copy, you're at
the mercy of a change to the file's permissions (or
even existence) between the calls, so you'd have to
cope with a potential exception in any case. Better
perhaps to do it that way in the first place. This
point of view is supported by, among others, GvR
in a thread on python-dev. [4]

[1]
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore9
8/html/_crt__chmod.2c_._wchmod.asp[2]
http://svn.python.org/view/python/trunk/Modules/posixmodule.c?rev=51762&
view=auto
[3]
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/
fs/setfileattributes.asp
[4]
http://mail.python.org/pipermail/python-dev/2004-November/049931.html

In short, do something like this:

<code>
try:
  shutil.copy (myfile, newfile)
except IOError:
  print "Couldn't copy; do useful things or ignore"
else:
  print "Copied ok"
</code>

TJG

________________________________________________________________________
This e-mail has been scanned for all viruses by Star. The
service is powered by MessageLabs. For more information on a proactive
anti-virus service working around the clock, around the globe, visit:
http://www.star.net.uk
________________________________________________________________________



More information about the Python-list mailing list