我怎样才能得到一个文件的权限掩码?
我怎么能得到一个文件的权限掩码像644或755在* nix使用Python? 有没有这样的function或类? 你们能帮我吗? 非常感谢你!
os.stat
是stat(2)系统调用接口的一个包装。
>>> 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'
从这里你会认识到典型的八进制权限。
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
你真的只对低位感兴趣,所以你可以砍掉其余的:
>>> oct(os.stat("test.txt")[ST_MODE])[-3:] '644' >>> # or better >>> oct(os.stat("test.txt").st_mode & 0777)
旁注:上面的部分决定了文件types,例如:
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)
我认为这是获取文件的权限位的最清晰的方式:
stat.S_IMODE(os.lstat("file").st_mode)
os.lstat函数将在文件是符号链接的情况下,给你链接本身的模式,而os.stat提领链接。 所以我觉得os.lstat是最普遍有用的。
下面是一个例子,给出了常规文件“testfile”和符号链接到后面的“testlink”:
import stat import os print oct(stat.S_IMODE(os.lstat("testlink").st_mode)) print oct(stat.S_IMODE(os.stat("testlink").st_mode))
这个脚本为我输出以下内容:
0777 0666
另一种方法来做到这一点,如果你不想解决什么stat意味着使用os.access命令http://docs.python.org/library/os.html#os.access 但阅读关于可能的文档安全问题
例如,检查具有读/写权限的文件test.dat的权限
os.access("test.dat",os.R_OK) >>> True #Execute permissions os.access("test.dat",os.X_OK) >>> False #And Combinations thereof os.access("test.dat",os.R_OK or os.X_OK) >>> True os.access("test.dat",os.R_OK and os.X_OK) >>> False
辛(os.stat( '文件')ST_MODE。)[4:]
在os模块里面有很多基于文件的function。 如果你运行os.stat(filename)
你总是可以交换结果。
os.stat类似于c-lib stat(在linux上man 2 stat来查看信息)
stats = os.stat('file.txt') print stats.st_mode