2012-05-24 10 views
6

Domanda:

come si usa in modo efficiente la funzione stat per ottenere i permessi dei file significativi (utenti, gruppi e altri).Usando la funzione stat di Python per ottenere in modo efficiente proprietario, il gruppo e altre autorizzazioni

Dettagli:

sto interrogando la permessi dei file in questo modo:

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

Ciò restituisce i permessi in forma decimale. Quindi se fooBar.txt ha i permessi del file ottale 0700, qui permissions è impostato sul valore decimale 448. Quello che voglio è quello di impostare 9 variabili per ogni autorizzazione (ownerRead, ownerWright, ownerExecute, groupRead, ...) Se stavo per fare questo, mi piacerebbe utilizzare un metodo di forza bruta in questo modo:

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 

Esiste un modo più efficiente per farlo senza dover convertire in ottale dato che questa funzione verrà chiamata un po '?

+0

Hai solo bisogno di segnare nomi come 'global' se avete intenzione di modificarli . Dal momento che dubito che modificherete i moduli 'os' e' stat', non è necessario contrassegnarli come 'globali 'ovunque. –

+0

oops, il mio male, ho copiato questo da dentro una funzione – puk

+0

Lo so, ho indovinato. Lascia che te lo dica di nuovo: non è necessario dichiarare questi 'globali' poiché verranno cercati automaticamente dall'ambito del modulo senza quello. –

risposta

5

è possibile utilizzare il bit a bit ed esercente:

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

geniale! Grazie, – puk

5

Usa AND bit a bit e le costanti nella 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) 
... 

Tanto più leggibile.

+1

dang, ho appena finito di allineare perfettamente i miei '0100' e' 0010' – puk

3

Ho messo questo insieme in una funzione che ottiene i permessi 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 

Usage:

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