web-dev-qa-db-fra.com

Le module Python os.chmod (fichier, 664) ne modifie pas l'autorisation de rw-rw-r-- mais -w - wx ----

Récemment, j'utilise Python module os. Lorsque j'ai tenté de modifier l'autorisation d'un fichier, je n'ai pas obtenu le résultat attendu. Par exemple, j'avais l'intention de changer l'autorisation de rw-rw-r--,

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

La permission 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 de code 664 à 0664 dans le code, le résultat obtenu est exactement ce dont j'ai besoin, par exemple.

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 aider à expliquer pourquoi ce premier 0 est si important pour obtenir le résultat correct?

94
AplusG

Trouvé ceci sur un forum différent

Si vous vous demandez pourquoi ce zéro est important, cela est dû au fait que les autorisations sont définies en tant qu'entier octal et que Python traite automatiquement tout entier avec un zéro initial en tant qu'octal. Ainsi, os.chmod ("fichier", 484) (en décimal) donnerait le même résultat.

Ce que vous faites est de passer 664 qui en octal est 1230

Dans votre cas, vous auriez besoin

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

[Mise à jour] Notez que pour Python 3 vous avez le préfixe avec 0o (zéro oh). E.G, 0o666

107
RedBaron

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

$ chmod 755 somefile

Utilisation:

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

Si votre Python est antérieur à la version 2.6:

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

"0" en tête signifie qu'il s'agit d'une constante octale et non décimale. et vous avez besoin d'un octal pour changer de mode de fichier.

les autorisations sont un masque de bits, par exemple, rwxrwx --- correspond à 111111000 en binaire, et il est très facile de regrouper 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.

9
lenik

Utilisez des symboles d'autorisation au lieu de nombres

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é à l'adresse https://docs.python.org/3/library/os.html#os.chmod et les noms sont les mêmes que ceux de API POSIX C valeurs documentées dans man 2 stat.

Un autre avantage est la plus grande portabilité mentionnée dans la documentation:

Remarque: Bien que Windows prenne en charge chmod(), vous ne pouvez définir le drapeau de lecture du fichier qu’avec celui-ci (via les constantes stat.S_IWRITE et 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" depuis python?

Testé sous Ubuntu 16.04, Python 3.5.2.