【问题标题】:Using Python's stat function to efficiently get owner, group and other permissions使用Python的stat函数高效获取owner、group等权限
【发布时间】:2012-05-31 06:41:06
【问题描述】:

问题:

如何有效地使用stat 函数来获得有意义的文件权限(用户、组和其他)。

详情:

我正在像这样查询文件权限:

statInfo = os.stat
permissions = stat.S_IMODE ( os.stat ( 'fooBar.txt' ).st_mode )

这会以十进制形式返回权限。所以如果fooBar.txt拥有八进制文件权限0700,这里permissions设置为十进制值448。我想要的是为每个权限设置 9 个变量(ownerReadownerWrightownerExecutegroupRead,...)如果我要这样做,我会使用这样的蛮力方法:

statInfo = os.stat
permissions = stat.S_IMODE ( os.stat ( 'fooBar.txt' ).st_mode )
octPermissions = oct ( permissions )

ownerRead = octPermissions [1] >= 4
ownerWrite = octPermissions [1] == 2 or octPermissions [1] == 6 or octPermissions [1] == 3 or 
ownerExecute = octPermissions [1] == 1 or octPermissions [1] == 5 or octPermissions [1] == 3

有没有更有效的方法来做到这一点而不必转换为八进制,因为这个函数会被调用很多次?

【问题讨论】:

  • 如果要更改名称,只需将名称标记为global。因为我怀疑你会修改osstat 模块,所以你不需要在任何地方将它们标记为global
  • 哎呀,我的错,我从函数内部复制了这个
  • 我知道,我猜。让我再次告诉你:你不需要声明这些global,因为没有这些,它们会自动从模块范围中查找。

标签: python permissions stat octal


【解决方案1】:

您可以使用按位与运算符:

m = os.stat('fooBar.txt').st_mode
otherExec  = bool(m & 0001)
otherWrite = bool(m & 0002)
otherRead  = bool(m & 0004)
groupExec  = bool(m & 0010)
groupWrite = bool(m & 0020)
groupRead  = bool(m & 0040)
...

【讨论】:

    【解决方案2】:

    使用按位与和stat module 中的常量:

    import stat
    import os
    
    mode = os.stat('fooBar.txt').st_mode
    
    otherRead  = bool(mode & stat.S_IROTH)
    otherWrite = bool(mode & stat.S_IWOTH)
    otherExec  = bool(mode & stat.S_IXOTH)
    ...
    

    更具可读性。

    【讨论】:

    • 该死,我刚刚完成了我的 01000010 的完美对齐
    【解决方案3】:

    我已经把它放在一个获得 UNIX 权限的函数中:

    import os
    from stat import (S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP,
                      S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH)
    
    def bit2int(bit):
        return int(oct(bit))
    
    def convert_st_mode(st_mode):
        bits = (S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP,
                S_IROTH, S_IWOTH, S_IXOTH)
        mode = "%03d" % sum(int(bool(st_mode & bit)) * bit2int(bit) for bit in bits)
        return mode
    
    def get_unix_permissions(pth):
        mode = convert_st_mode(os.stat(pth).st_mode)
        return mode
    

    用法:

    mode = get_unix_permissions("somefile")
    print(mode)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 2019-11-04
      • 2020-05-30
      • 2018-12-26
      • 2019-12-02
      • 1970-01-01
      相关资源
      最近更新 更多