How can I get a file's permission mask?
Question: How can I get a file's permission mask like 644 or 755 on *nix using python?
Is there any function or class for doing that? Could you guys help me out?
Thank you very much!


Answer: `os.stat` is a wrapper around the [stat(2)](http://linux.die.net/man/2/stat)
system call interface.

    
    
    >>> import os
    >>> from stat import *
    >>> os.stat("test.txt") # returns 10-tupel, you really want the 0th element ...
    posix.stat_result(st_mode=33188, st_ino=57197013, \
        st_dev=234881026L, st_nlink=1, st_uid=501, st_gid=20, st_size=0, \
        st_atime=1300354697, st_mtime=1300354697, st_ctime=1300354697)
    
    >>> os.stat("test.txt")[ST_MODE] # this is an int, but we like octal ...
    33188
    
    >>> oct(os.stat("test.txt")[ST_MODE])
    '0100644'
    

From here you'll recognize the typical octal permissions.

    
    
    S_IRWXU 00700   mask for file owner permissions
    S_IRUSR 00400   owner has read permission
    S_IWUSR 00200   owner has write permission
    S_IXUSR 00100   owner has execute permission
    S_IRWXG 00070   mask for group permissions
    S_IRGRP 00040   group has read permission
    S_IWGRP 00020   group has write permission
    S_IXGRP 00010   group has execute permission
    S_IRWXO 00007   mask for permissions for others (not in group)
    S_IROTH 00004   others have read permission
    S_IWOTH 00002   others have write permission
    S_IXOTH 00001   others have execute permission
    

You are really only interested in the lower _bits_ , so you could chop off the
rest:

    
    
    >>> oct(os.stat("test.txt")[ST_MODE])[-3:]
    '644'
    >>> # or better
    >>> oct(os.stat("test.txt").st_mode & 0777)
    

* * *

Sidenote: the upper parts determine the filetype, e.g.:

    
    
    S_IFMT  0170000 bitmask for the file type bitfields
    S_IFSOCK    0140000 socket
    S_IFLNK 0120000 symbolic link
    S_IFREG 0100000 regular file
    S_IFBLK 0060000 block device
    S_IFDIR 0040000 directory
    S_IFCHR 0020000 character device
    S_IFIFO 0010000 FIFO
    S_ISUID 0004000 set UID bit
    S_ISGID 0002000 set-group-ID bit (see below)
    S_ISVTX 0001000 sticky bit (see below)
    

