Seite 2 von 3
Verfasst: Dienstag 12. Februar 2008, 11:08
von tux21b
Warum braucht ihr da alle so ein eigenartiges Dict mit allen möglichen Permutationen? Ihr könnt einfach die Bits durchgehen...
Code: Alles auswählen
import os
def symbolic_notation(mode):
notation = list(reversed('rwxrwxrwx'))
return ''.join(mode & 2**i and notation[i] or '-' for i in range(8, -1, -1))
print symbolic_notation(os.stat('blub').st_mode)
Das ganze sollte auch relativ leicht um Sticky-Bits etc. erweiterbar sein...
Gruß
Christoph
Verfasst: Dienstag 12. Februar 2008, 13:15
von jens
So, ich hab es nun mal eingebaut:
http://pylucid.net:8080/pylucid/changeset/1389
Das ganze steckt im zusätzlichen django template filter, hier:
http://pylucid.net:8080/pylucid/browser ... y?rev=1389
@tux21b: Natürlich ist ein daten dict mit allen Permutationen etwas unschön. Aber ich finde die Variante viel einfach zu lesen als deine. Ich weiß auf den ersten Blick nicht, wie deine Variante arbeitet...
Verfasst: Dienstag 12. Februar 2008, 15:23
von Leonidas
Jens, dein dict ist doch Quatsch, wenn es von 0 bis 7 geht, da gibts so ne Struktur die heißt Listen, genau für sowas.
Verfasst: Dienstag 12. Februar 2008, 15:28
von jens
Jep stimmt! Und noch besser, ein tuple nehmen
http://pylucid.net:8080/pylucid/changeset/1393
Verfasst: Dienstag 12. Februar 2008, 15:55
von BlackJack
Und nun bitte noch ``result = []`` entfernen.

Verfasst: Dienstag 12. Februar 2008, 16:09
von jens
Verfasst: Dienstag 12. Februar 2008, 21:40
von tux21b
jens hat geschrieben:@tux21b: Natürlich ist ein daten dict mit allen Permutationen etwas unschön. Aber ich finde die Variante viel einfach zu lesen als deine. Ich weiß auf den ersten Blick nicht, wie deine Variante arbeitet...
Liegt wohl daran, dass ich das ganze sehr kurz gefasst habe, aber vom Algorithmus her finde ich die Variante doch um einiges verständlicher.
Kurz gesagt, du gehst alle Bits der Reihe nach durch, schaust nach ob es gesetzt ist und wenn ja, zeigst du das symbol dafür an und ansonsten einen '-'.
Verfasst: Mittwoch 13. Februar 2008, 09:03
von jens
OK, versuchen wir das mal auseinander zu nehmen (Fragen, siehe Kommentar):
Code: Alles auswählen
import os
CHMOD_TRANS_DATA = ("x","w","r")*3
def symbolic_notation(mode):
result = []
for i in xrange(8, -1, -1):
# Wie kann man "m" besser benennen???
m = mode & 2**i
# Was passiert hier genau?
symbols = m and CHMOD_TRANS_DATA[i] or '-'
result.append(symbols)
return ''.join(result)
test_data = (0100000, 0100123, 0100456, 0100765)
for mode in test_data:
print "%o -> %s" % (mode, symbolic_notation(mode))
print "="*80
EDIT: Hab mal eine Wiki Seite angelegt: [wiki]755 -> rwxr-xr-x[/wiki](Doller Name, oder?)
Verfasst: Mittwoch 13. Februar 2008, 14:19
von HWK
Oder so:
Code: Alles auswählen
>>> ''.join(0755 & 0400 >> i and x or '-' for i, x in enumerate('rwxrwxrwx'))
'rwxr-xr-x'
MfG
HWK
Verfasst: Mittwoch 13. Februar 2008, 22:58
von tux21b
HWK hat geschrieben:Oder so:
Code: Alles auswählen
>>> ''.join(0755 & 0400 >> i and x or '-' for i, x in enumerate('rwxrwxrwx'))
'rwxr-xr-x'
MfG
HWK
Das gefällt mir. enumerate ist verständlicher, und das ganze ist nocheinmal kürzer

Verfasst: Donnerstag 14. Februar 2008, 09:06
von jens
Hab das mal auf der Wiki Seite übernommen...
Re: Dateirechte ermitteln & 755 -> rwxr-xr-x ???
Verfasst: Dienstag 6. September 2011, 16:24
von jens
Hab mit
http://wiki.python.de/755%20-%3E%20rwxr-xr-x nochmal angesehen.
Was soll ich sagen, alle drei Beispiele funktionieren nicht wirklich:
Code: Alles auswählen
def symbolic_notation1(mode):
"""
>>> symbolic_notation1(644)
u'rw-r--r--'
>>> symbolic_notation1(40755)
u'rwxr-xr-x'
>>> symbolic_notation1("777")
u'rwxrwxrwx'
"""
return ''.join(
mode & 0400 >> i and x or '-' for i, x in enumerate('rwxrwxrwx')
)
def symbolic_notation2(mode):
"""
>>> symbolic_notation2(644)
u'rw-r--r--'
>>> symbolic_notation2(40755)
u'rwxr-xr-x'
>>> symbolic_notation2("777")
u'rwxrwxrwx'
"""
result = []
for i, x in enumerate('rwxrwxrwx'):
m = mode & 0400 >> i
symbol = m and x or '-'
result.append(symbol)
return ''.join(result)
CHMOD_TRANS_DATA = (
u"---", u"--x", u"-w-", u"-wx", u"r--", u"r-x", u"rw-", u"rwx",
)
def symbolic_notation3(mode):
"""
>>> symbolic_notation3(644)
u'rw-r--r--'
>>> symbolic_notation3(40755)
u'rwxr-xr-x'
>>> symbolic_notation3("777")
u'rwxrwxrwx'
"""
mode = mode & 0777 # strip "meta info"
mode_string = u"%o" % mode
return u''.join(CHMOD_TRANS_DATA[int(num)] for num in mode_string)
if __name__ == "__main__":
import doctest
print doctest.testmod(verbose=False)
Ausgaben:
Code: Alles auswählen
...
3 items had failures:
3 of 3 in __main__.symbolic_notation1
3 of 3 in __main__.symbolic_notation2
3 of 3 in __main__.symbolic_notation3
***Test Failed*** 9 failures.
TestResults(failed=9, attempted=9)
Meine Aktuelle Lösung, die auch funktioniert:
Code: Alles auswählen
CHMOD_TRANS_DATA = (
u"---", u"--x", u"-w-", u"-wx", u"r--", u"r-x", u"rw-", u"rwx"
)
def chmod_symbol(octal_value):
"""
Transform a os.stat().st_octal_value octal value to a symbolic string.
ignores meta infromation like SUID, SGID or the Sticky-Bit.
e.g. 40755 -> rwxr-xr-x
>>> chmod_symbol(644)
u'rw-r--r--'
>>> chmod_symbol(40755)
u'rwxr-xr-x'
>>> chmod_symbol("777")
u'rwxrwxrwx'
"""
octal_value_string = str(octal_value)[-3:] # strip "meta info"
return u''.join(CHMOD_TRANS_DATA[int(num)] for num in octal_value_string)
Re: Dateirechte ermitteln & 755 -> rwxr-xr-x ???
Verfasst: Mittwoch 7. September 2011, 10:19
von sma
Warum nicht einfach so?
Code: Alles auswählen
def chmod_sym(val):
def tripple(v):
return "-r"[bool(v & 4)] + "-w"[bool(v & 2)] + "-x"[bool(v & 1)]
return tripple(val / 64) + tripple(val / 8) + tripple(val)
Wobei das mit dem bool zugegebenermaßen ein bisschen trickreich ist - aber kürzer als ein if/else

Stefan
Re: Dateirechte ermitteln & 755 -> rwxr-xr-x ???
Verfasst: Mittwoch 7. September 2011, 10:24
von jens
Tut's nicht (btw. Code ist im Forum Falsch, wegen:
http://www.python-forum.de/viewtopic.php?f=10&t=22855 ):
Code: Alles auswählen
def chmod_sym(val):
"""
>>> chmod_sym(644)
u'rw-r--r--'
>>> chmod_sym(40755)
u'rwxr-xr-x'
>>> chmod_sym("777")
u'rwxrwxrwx'
"""
val = int(val)
def tripple(v):
return "-r"[bool(v & 4)] + "-w"[bool(v & 2)] + "-x"[bool(v & 1)]
return tripple(val / 64) + tripple(val / 8) + tripple(val)
if __name__ == "__main__":
import doctest
print doctest.testmod(verbose=False)
Code: Alles auswählen
**********************************************************************
File "test.py", line 4, in __main__.chmod_sym
Failed example:
chmod_sym(644)
Expected:
u'rw-r--r--'
Got:
'-w----r--'
**********************************************************************
File "test.py", line 6, in __main__.chmod_sym
Failed example:
chmod_sym(40755)
Expected:
u'rwxr-xr-x'
Got:
'r--rw--wx'
**********************************************************************
File "test.py", line 8, in __main__.chmod_sym
Failed example:
chmod_sym("777")
Expected:
u'rwxrwxrwx'
Got:
'r----x--x'
**********************************************************************
1 items had failures:
3 of 3 in __main__.chmod_sym
***Test Failed*** 3 failures.
TestResults(failed=3, attempted=3)
Re: Dateirechte ermitteln & 755 -> rwxr-xr-x ???
Verfasst: Mittwoch 7. September 2011, 10:51
von /me
jens hat geschrieben:Tut's nicht
Der Code von sma hätte die Zahlen gerne explizit als Oktalzahl angegeben. Damit schlägt zwangsläufig jeder der bestehenden Tests fehl.
Re: Dateirechte ermitteln & 755 -> rwxr-xr-x ???
Verfasst: Mittwoch 7. September 2011, 10:58
von sma
Tut sehr wohl, weil 644 eben nicht 0644 ist. Wie "/me" schon schrieb, ich erwarte natürlich die korrekte Zahl, also beispielsweise 420 oder 0x1a4 oder eben 0644. Das sind ja nur drei verschiedene Repräsentationen für die Zahl, die hinter rw-r--r-- steht.
Stefan
Re: Dateirechte ermitteln & 755 -> rwxr-xr-x ???
Verfasst: Mittwoch 7. September 2011, 11:13
von jens
sma hat geschrieben:also beispielsweise 420 oder 0x1a4 oder eben 0644. Das sind ja nur drei verschiedene Repräsentationen für die Zahl
Hm. Die kann man allerdings nicht wirklich gut unterscheiden, oder? Also das man die Funktion mit allem füttern kann...
Re: Dateirechte ermitteln & 755 -> rwxr-xr-x ???
Verfasst: Mittwoch 7. September 2011, 11:23
von Leonidas
Man kann zumindest eine Bereichsprüfung machen, wenn die Zahl größer 0777 ist, dann ist sie mit ziemlicher Sicherheit falsch.
Re: Dateirechte ermitteln & 755 -> rwxr-xr-x ???
Verfasst: Mittwoch 7. September 2011, 11:43
von sma
Jenseits von 511 sind noch weitere Flags. Meiner Funktion ist das aber egal, die werden einfach ignoriert.
Stefan
Re: Dateirechte ermitteln & 755 -> rwxr-xr-x ???
Verfasst: Mittwoch 7. September 2011, 13:03
von jens
OK, mein Fehler...
Es geht ja eigentlich um die Umwandlung von
os.stat().st_mode und dabei bekommt man halt die Zahl in Octal...
EDIT: Hab das mal im Wiki versucht zu erklären:
http://wiki.python.de/755%20-%3E%20rwxr ... 2=7&rev1=6