web-dev-qa-db-fra.com

Comment créez-vous dans python un fichier avec des autorisations que d'autres utilisateurs peuvent écrire

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

13
Richard

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).

15
user590028

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.
36
AXO

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:

Voir aussi: Écrire un fichier avec des autorisations spécifiques en Python