148 votes

Le module Python os.chmod(file, 664) ne change pas la permission en rw-rw-r-- mais -w--wx----

Récemment, j'utilise le module Python os. Lorsque j'ai essayé de modifier la permission d'un fichier, je n'ai pas obtenu le résultat escompté. Par exemple, je voulais changer la permission en rw-rw-r--,

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

L'autorisation de propriété est en fait -w--wx--- (230)

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

Cependant, si je change 664 en 0664 dans le code, le résultat est exactement ce dont j'ai besoin, par ex.

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

Le résultat est :

-rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file

Quelqu'un pourrait-il m'expliquer pourquoi le 0 initial est si important pour obtenir un résultat correct ?

179voto

RedBaron Points 2391

J'ai trouvé ça sur un autre forum

Si vous vous demandez pourquoi ce premier zéro est important, c'est parce que les permissions sont définies comme un entier octal, et Python traite automatiquement automatiquement tout nombre entier avec un zéro en tête comme étant octal. Donc os.chmod("file", 484) (en décimal) donnerait le même résultat.

Ce que vous faites, c'est passer 664 qui en octal est 1230

Dans votre cas, vous auriez besoin de

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

[Note : pour Python 3, le préfixe est 0o (zero oh). PAR EXEMPLE 0o666

154voto

Dima Points 458

Donc pour les personnes qui veulent une sémantique similaire à :

$ chmod 755 somefile

Utilisez :

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

Si votre Python est plus ancien que 2.6 :

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

26voto

Ciro Santilli Points 3341

*Utilisez les symboles d'autorisation ( `stat.S_I` ) au lieu des nombres octaux bruts**

Votre problème aurait été évité si vous aviez utilisé les symboles d'autorisation plus sémantiquement nommés plutôt que des nombres magiques bruts, par exemple pour 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
)

Ceci est documenté à https://docs.python.org/3/library/os.html#os.chmod et les noms sont les mêmes que ceux de la API POSIX C qui est également présent à man 2 stat y man 2 chmod :

S_IRUSR  (00400)  read by owner
S_IWUSR  (00200)  write by owner
S_IXUSR  (00100)  execute/search by owner
S_IRGRP  (00040)  read by group
S_IWGRP  (00020)  write by group
S_IXGRP  (00010)  execute/search by group
S_IROTH  (00004)  read by others
S_IWOTH  (00002)  write by others
S_IXOTH  (00001)  execute/search by others

Un autre avantage est la plus grande portabilité, comme mentionné dans les documents :

Remarque : Bien que Windows prenne en charge chmod() vous ne pouvez que définir l'indicateur de lecture seule du fichier (via la commande stat.S_IWRITE y stat.S_IREAD ou une valeur entière correspondante). Tous les autres bits sont ignorés.

chmod +x est démontré à : Comment faire un simple "chmod +x" à partir de python ?

Testé dans Ubuntu 16.04, Python 3.5.2.

17voto

Mik Points 588

Si vous avez sauvegardé les permissions souhaitées dans une chaîne de caractères, procédez comme suit

s = '660'
os.chmod(file_path, int(s, base=8))

13voto

lenik Points 7247

Leader 0 signifie que c'est octal et non la décimale. Et vous avez besoin d'une octale pour changer de mode de fichier.

Les permissions sont un masque de bits, par exemple, rwxrwx--- es 111111000 en binaire, et il est très facile de grouper les bits par 3 pour les convertir en octal, puis de calculer la représentation décimale.

0644 (octal) est 0.110.100.100 en binaire (j'ai ajouté des points pour la lisibilité), ou, comme vous pouvez le calculer, 420 en décimal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X