it-swarm.com.de

Python Modul os.chmod (Datei, 664) ändert die Berechtigung für rw-rw-r-- aber -w - wx ---- nicht

In letzter Zeit verwende ich das Python Modul os, als ich versuchte, die Berechtigung einer Datei zu ändern, habe ich nicht das erwartete Ergebnis erhalten. Ich beabsichtigte beispielsweise, die Berechtigung für rw-rw- zu ändern. r--,

os.chmod("/tmp/test_file", 664)

Die Eigentumserlaubnis ist tatsächlich -w - wx --- (230)

--w--wx--- 1 ag ag 0 Mar 25 05:45 test_file

Wenn ich jedoch den Code von 664 auf 0664 ä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

Kann jemand erklären, warum die führende 0 so wichtig ist, um das richtige Ergebnis zu erzielen?

94
AplusG

Fand dies auf einem anderes Forum

Wenn Sie sich fragen, warum diese führende Null wichtig ist, dann, weil Berechtigungen als oktale Ganzzahl festgelegt sind und Python behandelt automatisch alle Ganzzahlen mit einer führenden Null als oktal. Also os.chmod (" Datei ", 484) (in Dezimal) würde das gleiche Ergebnis ergeben.

Sie übergeben 664, Was im Oktal 1230 Ist.

In deinem Fall würdest du brauchen

os.chmod("/tmp/test_file", 436)

[Update] Hinweis, für Python 3 haben Sie das Präfix 0o (null Oh). ZB 0o666

107
RedBaron

Also für Leute, die Semantik ähnlich wollen:

$ chmod 755 somefile

Verwenden:

$ python -c "import os; os.chmod('somefile', 0o755)"

Wenn Ihr Python älter als 2.6 ist:

$ python -c "import os; os.chmod('somefile', 0755)"
114
Dima

führende "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, z. B. ist rwxrwx --- 111111000 in binär, und es ist sehr einfach, Bits nach 3 zu gruppieren, um sie in das Oktal umzuwandeln, als die Dezimaldarstellung zu berechnen.

0644 (oktal) ist 0.110.100.100 in binär (ich habe Punkte für die Lesbarkeit hinzugefügt) oder, wie Sie vielleicht berechnen können, 420 in dezimal.

9
lenik

Verwenden Sie Berechtigungssymbole anstelle von Zahlen

Ihr Problem wäre umgangen worden, wenn Sie die mehr semantisch benannten Berechtigungssymbole anstelle von magischen Rohzahlen verwendet hätten, z. für 664:

#!/usr/bin/env python3

import os
import stat

os.chmod(
    'myfile',
    stat.S_IRUSR |
    stat.S_IWUSR |
    stat.S_IRGRP |
    stat.S_IWGRP |
    stat.S_IROTH
)

Dies ist dokumentiert unter https://docs.python.org/3/library/os.html#os.chmod und die Namen sind die gleichen wie bei POSIX C API Werte dokumentiert unter man 2 stat.

Ein weiterer Vorteil ist die größere Portabilität, wie in den Dokumenten erwähnt:

Hinweis: Obwohl Windows chmod() unterstützt, können Sie nur das Nur-Lese-Flag der Datei damit setzen (über die Konstanten stat.S_IWRITE Und stat.S_IREAD Oder einen entsprechenden ganzzahligen Wert). Alle anderen Bits werden ignoriert.

chmod +x Wird demonstriert unter: Wie macht man ein einfaches "chmod + x" aus Python heraus?

Getestet in Ubuntu 16.04, Python 3.5.2.