Kürzlich habe ich das Python-Modul os verwendet. Als ich versuchte, die Berechtigung einer Datei zu ändern, habe ich nicht das erwartete Ergebnis erhalten. Zum Beispiel wollte ich die Berechtigung in rw-rw-r-- ändern,
os.chmod("/tmp/test_file", 664)
Die Eigentumserlaubnis lautet tatsächlich -w - wx --- (230)
--w--wx--- 1 ag ag 0 Mar 25 05:45 test_file
Wenn ich jedoch 664 in 0664 im Code ändere, ist das Ergebnis genau das, was ich brauche, z
os.chmod("/tmp/test_file", 0664)
Das Ergebnis ist:
-rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file
Könnte jemand helfen zu erklären, warum diese führende 0 so wichtig ist, um das richtige Ergebnis zu erzielen?
python
file
permissions
chmod
AplusG
quelle
quelle
Antworten:
Fand dies in einem anderen Forum
Was Sie tun, ist zu übergeben,
664
was in Oktal ist1230
In Ihrem Fall würden Sie brauchen
[Update] Hinweis: Für Python 3 haben Sie das Präfix 0o (null oh). Z.B,
0o666
quelle
1
wird nicht verworfen! Das ist das Sticky / Setuid / Setgid-Bit und 1 bedeutetsticky
. Bei der Verwendung könnenls -l
Sie feststellen, dass Berechtigungen jetztT
am Ende ein ...Also für Leute, die eine ähnliche Semantik wollen wie:
Verwenden:
Wenn Ihr Python älter als 2.6 ist:
quelle
00755
, nur um klar zu machen, wohin die suid / sgid / sticky-Bits gehen, für den Fall, dass ein späterer Entwickler durchkommt und dieses alte Skript verwenden möchte, zum Beispiel sgid mit2755
, kann dann aber nicht herausfinden, warum Die Dauerwellen sind komplett vermasselt. ;)führend
0
bedeutet, dass dies eine Oktalkonstante ist, nicht die Dezimalkonstante. und Sie benötigen ein Oktal, um den Dateimodus zu ändern.Berechtigungen sind eine Bitmaske zum Beispiel
rwxrwx---
ist111111000
binär, und es ist sehr einfach zu Sammelbits von 3 auf die Oktal zu konvertieren, als berechnen die Dezimaldarstellung.0644
(oktal) ist0.110.100.100
binär (ich habe Punkte zur besseren Lesbarkeit hinzugefügt) oder, wie Sie berechnen können,420
dezimal.quelle
Verwenden Sie Berechtigungssymbole anstelle von Zahlen
Ihr Problem wäre vermieden worden, wenn Sie die semantisch benannten Berechtigungssymbole anstelle von rohen magischen Zahlen verwendet hätten, z. B
664
.:Dies ist unter https://docs.python.org/3/library/os.html#os.chmod dokumentiert. Die Namen stimmen mit den unter dokumentierten POSIX C-API- Werten überein
man 2 stat
.Ein weiterer Vorteil ist die größere Portabilität, wie in den Dokumenten erwähnt:
chmod +x
wird demonstriert unter: Wie macht man ein einfaches "chmod + x" aus Python heraus?Getestet in Ubuntu 16.04, Python 3.5.2.
quelle
Wenn Sie die gewünschten Berechtigungen für die Zeichenfolge gespeichert haben, tun Sie dies
quelle
Die Verwendung der stat. * Bit-Masken scheint mir die portabelste und expliziteste Möglichkeit zu sein, dies zu tun. Andererseits vergesse ich oft, wie ich damit am besten umgehen kann. Hier ist ein Beispiel, wie Sie die Berechtigungen "Gruppe" und "Andere" ausblenden und die Berechtigungen "Eigentümer" unberührt lassen. Die Verwendung von Bitmasken und Subtraktion ist ein nützliches Muster.
quelle