2013-03-25 5 views
71

Kürzlich verwende ich Python-Modul os, als ich versuchte, die ändern Erlaubnis einer Datei, habe ich nicht das erwartete Ergebnis erhalten. Zum Beispiel sollte ich die Erlaubnis ändern rw-rw-r--,Python-Modul os.chmod (Datei, 664) ändert nicht die Berechtigung zu rw-rw-r-- aber -w-wx ----

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

Das Eigentum Erlaubnis tatsächlich -w ist - wx --- (230)

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

jedoch Wenn ich im Code 664 zu 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 

Könnte jemand helfen zu erklären, warum tut der führenden 0 so wichtig ist das richtige Ergebnis zu bekommen?

+20

Octal. Oktal. Oktal. –

+0

Flag für Unix .. –

+2

Ich öffnete ein Problem für Python-Dokumentation unter http://bugs.python.org/issue25377, weil das aus den Dokumenten klar sein sollte. –

Antwort

73

Fand diese auf einem different forum

Wenn Sie sich fragen, warum die führende Null wichtig ist, dann ist es, weil Berechtigungen als oktale Ganzzahl gesetzt werden, und Python automagically behandelt eine ganze Zahl mit führender Null als Oktal. So os.modmod ("Datei", 484) (in Dezimal) würde das gleiche Ergebnis geben.

Was machst du 664 ist vorbei, die in Oktal 1230

In Ihrem Fall ist, würde Sie

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

[Update] Hinweis benötigen, für Python 3 Sie haben Präfix mit 0o (Null oh). E.G, 0o666

+0

Danke, aber ich bin immer noch verwirrt, 484 in Dezimal bedeutet 744 in Oktal, was Sinn macht in dem Thread, den Sie im Forum erwähnt haben.Wenn ich jedoch 644 im Dezimalwert gebe, geht es in Oktal auf 1204. Wie verhält sich 1204 zu 230 in Oktal? – AplusG

+0

Das wurde wörtlich von der Post abgeholt. Ich habe hinzugefügt, was Sie brauchen (436) im letzten Teil der Antwort – RedBaron

+0

oh ... sorry ... mein Fehler ... fälschlicherweise 644 für 664 ... – AplusG

6

führende "0" bedeutet, dass dies Oktalkonstante ist, nicht die Dezimalstelle. und du brauchst ein Oktal, um den Dateimodus zu ändern.

Berechtigungen sind eine Bitmaske, zum Beispiel, rwxrwx --- ist 111111000 in binär, und es ist sehr einfach zu gruppieren Bits um 3 in die Oktal zu konvertieren, als die dezimale Darstellung 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, 420 in Dezimal.

76

Also für Leute, die symantics ähnlich zu wollen:

$ chmod 755 somefile 

In python2:

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

Aber in python3:

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

Das Python3-Format funktioniert auch in Python 2.7.9. Ich habe frühere Versionen nicht überprüft. –

Verwandte Themen