Comment puis-je dans python (3) créer un fichier que les autres utilisateurs peuvent également écrire. Je l'ai jusqu'à présent, mais cela change la
os.chmod("/home/pi/test/relaxbank1.txt", 777)
with open("/home/pi/test/relaxbank1.txt", "w") as fh:
fh.write(p1)
ce que j'obtiens
--- sr-S - t 1 racine racine 12 avril 20 13:21 relaxbank1.txt
attendu (après avoir fait en ligne de commande $ Sudo chmod 777 relaxbank1.txt)
-rwxrwxrwx 1 root root 12 avril 20 13:21 relaxbank1.txt
Le problème est que votre appel à open()
recrée l'appel. Soit vous devez déplacer la chmod()
après avoir fermé le fichier, OR changez le mode de fichier en w+
.
Option 1:
with open("/home/pi/test/relaxbank1.txt", "w+") as fh:
fh.write(p1)
os.chmod("/home/pi/test/relaxbank1.txt", 0o777)
Option 2:
os.chmod("/home/pi/test/relaxbank1.txt", 0o777)
with open("/home/pi/test/relaxbank1.txt", "w+") as fh:
fh.write(p1)
Commentaire: Option1 est légèrement meilleure car elle gère la condition dans laquelle le fichier n'existe peut-être pas déjà (auquel cas la os.chmod()
lèvera une exception).
Si vous ne souhaitez pas utiliser os.chmod
et préférez que le fichier soit créé avec les autorisations appropriées, vous pouvez alors utiliser os.open
pour créer le descripteur de fichier approprié puis open
le descripteur:
import os
# The default umask is 0o22 which turns off write permission of group and others
os.umask(0)
with open(os.open('filepath', os.O_CREAT | os.O_WRONLY, 0o777), 'w') as fh:
fh.write(...)
Python 2 Remarque:
La fonction intégrée open () in Python 2.x ne prend pas en charge l'ouverture par le descripteur de fichier. Utilisez os.fdopen
à la place; sinon vous obtiendrez:
TypeError: coercing to Unicode: need string or buffer, int found.
Ceci est une méthode robuste
#!/usr/bin/env python3
import stat
import os
path = 'outfile.txt'
with open(path, 'w') as fh:
fh.write('blabla\n')
st = os.stat(path)
os.chmod(path, st.st_mode | stat.S_IWOTH)
Regarde comment:
stat.S_IWOTH
est utilisé à la place de la constante binaire brute, qui est plus sémantique+o
au fichier, et utilisez le umask
par défaut, voir aussi: Comment faire un simple "chmod + x" à partir de python?Voir aussi: Écrire un fichier avec des autorisations spécifiques en Python