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?
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
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)"
"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.
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 constantesstat.S_IWRITE
etstat.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.