Cette réponse n'utilise pas l' with
déclaration, mais il répond à plusieurs préoccupations avec la réponse par vartec, en particulier l' umask
préoccupation.
Tout d'abord, si le mode souhaité 0600
, elle ne peut plus être clairement spécifié que le nombre octal 0o600
. Cette syntaxe est valable au moins dans la version 2.6 de Python+. Mieux encore, il suffit d'utiliser l' stat
module.
import os, stat
mode = stat.S_IRUSR | stat.S_IWUSR # This is 0o600 in octal and 384 in decimal.
umask_original = os.umask(0)
try:
handle = os.fdopen(os.open('/path/to/file', os.O_WRONLY | os.O_CREAT, mode), 'w')
finally:
os.umask(umask_original)
handle.write(...)
handle.close()
À défaut de définir au préalable l' umask
de 0
peut conduire à une erreur d' mode
(permission), établis par os.open
. C'est parce que la valeur par défaut umask
peut ne pas être 0
, et il peut être appliqué à l' mode
. Par exemple, si mon originale umask
est 2
, et de mon mode spécifié est - 0o222
, si je n'arrive pas à mettre la umask
de 0
, le fichier résultant peut, au lieu d'avoir un mode
de mode ^ umask_original
, c'est à dire 0o220
, ce qui n'est pas ce que je voulais. Cela fait sens, en considérant mode ^ 0 == mode
. Notez que ^
moyen XOR au niveau du bit.
Attention: L' umask
est restauré à sa valeur d'origine dès que possible. Cette obtention et définition n'est pas thread-safe, et un threading.Lock
doit être utilisé si nécessaire.
Techniquement, os.fdopen
ne semble pas nécessaire dans l' try...finally
bloc, et peut être en dehors d'elle. Seulement os.open
semble nécessaire à l'intérieur du bloc.