2012-05-24 3 views
6

Frage:

Wie effizient ich die stat Funktion verwenden, um aussagekräftige Dateiberechtigungen (Benutzer, Gruppe und andere) zu erhalten.Mit Python Funktion stat effizient Besitzer zu erhalten, Gruppen und andere Berechtigungen

Details:

ich die Dateiberechtigungen sind Abfrage etwa so:

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

Diese Berechtigungen in Dezimalform zurück. Wenn fooBar.txt die oktalen Dateiberechtigungen 0700 hat, wird hier permissions auf den Dezimalwert 448 gesetzt. Was ich will, ist 9 Variablen für jede Berechtigung setzen (ownerRead, ownerWright, ownerExecute, groupRead, ...) Wenn ich dies tun würde, ich eine Brute-Force-Methode, wie so verwenden würde:

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 

Gibt es einen effizienteren Weg, dies zu tun, ohne in Oktal konvertieren zu müssen, da diese Funktion ziemlich oft aufgerufen wird?

+0

Sie brauchen nur Namen wie 'global' zu markieren, wenn Sie sie gehen zu ändern . Da ich bezweifle, dass Sie die Module "os" und "stat" modifizieren, müssen Sie sie nirgends als "global" markieren. –

+0

oops, mein Schlechter, ich kopierte dies von innen eine Funktion – puk

+0

Ich weiß, ich vermutete. Lassen Sie es mich noch einmal sagen: Sie müssen diese "global" nicht deklarieren, da sie automatisch ohne den Modulumfang abgefragt werden. –

Antwort

5

Sie könnten die bitweise AND-Operator verwenden:

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) 
... 
+0

brilliant! Danke – puk

5

Verwendung bitweise UND und die Konstanten in den 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) 
... 

So viel besser lesbar.

+1

dang it, ich habe gerade meine "0100's" und "0010's" perfekt ausgerichtet – puk

3

ich dies habe zusammen in eine Funktion setzen, die UNIX-Berechtigungen erhält:

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 

Verbrauch:

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