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 ?

5voto

Mik R Points 121

La réponse de @mc.dev était la meilleure réponse ici, j'ai fini par l'utiliser pour faire le wrapper de fonction ci-dessous pour la réutilisation. Merci pour le partage.

def chmod_digit(file_path, perms):
    """
    Helper function to chmod like you would in unix without having to preface 0o or converting to octal yourself.
    Credits: https://stackoverflow.com/a/60052847/1621381
    """
    os.chmod(file_path, int(str(perms), base=8))

0voto

Jason Drew Points 201

L'utilisation des masques de bits stat.* me semble être le moyen le plus portable et le plus explicite de le faire. Mais d'un autre côté, j'oublie souvent comment gérer cela au mieux. Voici donc un exemple de masquage des permissions "groupe" et "autre", sans toucher aux permissions "propriétaire". L'utilisation des bitmasks et de la soustraction est un modèle utile.

import os
import stat
def chmodme(pn):
    """Removes 'group' and 'other' perms. Doesn't touch 'owner' perms."""
    mode = os.stat(pn).st_mode
    mode -= (mode & (stat.S_IRWXG | stat.S_IRWXO))
    os.chmod(pn, mode)

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