2012-05-10 19 views
7

En Python (probamos este en 2.7 y anteriores) se ve como un archivo creado utilizando tempfile.NamedTemporaryFile no parece obedecer a la directiva máscara de usuario:¿Puedo establecer umask para tempfile.NamedTemporaryFile en python?

import os, tempfile 
os.umask(022) 
f1 = open ("goodfile", "w") 
f2 = tempfile.NamedTemporaryFile(dir='.') 
f2.name 

Out[33]: '/Users/foo/tmp4zK9Fe' 

ls -l 
-rw------- 1 foo foo 0 May 10 13:29 /Users/foo/tmp4zK9Fe 
-rw-r--r-- 1 foo foo 0 May 10 13:28 /Users/foo/goodfile 

Cualquier idea de por qué NamedTemporaryFile no recogerá la máscara de usuario? ¿Hay alguna manera de hacer esto durante la creación del archivo?

Siempre puedo solucionar esto con os.chmod(), pero esperaba algo que hiciera lo correcto durante la creación del archivo.

Respuesta

22

Esta es una característica de seguridad. El NamedTemporaryFile siempre se crea con el modo 0600, codificado en tempfile.py, line 235, porque es privado para su proceso hasta que lo abra con chmod. No hay argumento de constructor para cambiar este comportamiento.

+2

Gracias - tienes que amar a una respuesta que vincula a una línea específica en ¡la fuente! – shreddd

+0

Gracias por su respuesta. Simplemente notaré que esto es extraño, o de lo contrario me falta otra forma de hacer lo que quiero. Simplemente quiero usar un NamedTemporaryFile solo para poder descartarlo si encuentro errores al generarlo, pero moverlo a un archivo que podría haber creado de otra manera con un simple abrir (nombre, 'w "). Parece al igual que una solicitud de función se llama para ... – nealmcb

2

En caso podría ayudar a alguien, lo que quería hacer más o menos lo mismo, aquí está el código que he utilizado:

import os 
from tempfile import NamedTemporaryFile 

def UmaskNamedTemporaryFile(*args, **kargs): 
    fdesc = NamedTemporaryFile(*args, **kargs) 
    umask = os.umask(0) 
    os.umask(umask) 
    os.chmod(fdesc.name, 0o666 & ~umask) 
    return fdesc 
+1

¡Justo lo que quería! ¡Muchas gracias por molestar a la plomería de bajo nivel que estamos obligados a hacer! :) – nealmcb

Cuestiones relacionadas