2012-05-10 27 views
7

W Pythonie (próbowałem w 2,7 i poniżej) wygląda jak plik utworzony za pomocą tempfile.NamedTemporaryFile nie wydaje się przestrzegać dyrektywy umask:Czy mogę ustawić umask dla tempfile.NamedTemporaryFile w 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 

Każdy pomysł dlaczego NamedTemporaryFile nie odbierze umask? Czy jest jakiś sposób, aby to zrobić podczas tworzenia pliku?

Zawsze można obejść to za pomocą os.chmod(), ale miałem nadzieję, że coś, co zrobiłem dobrze podczas tworzenia pliku.

Odpowiedz

22

To jest funkcja zabezpieczająca. NamedTemporaryFile jest zawsze tworzony w trybie 0600, zakodowany na stałe na tempfile.py, line 235, ponieważ jest prywatny dla twojego procesu, dopóki go nie otworzysz pod numerem chmod. Nie ma argumentu konstruktora, który zmieniłby to zachowanie.

+2

Dzięki - pokochałbyś odpowiedź, że linki do konkretnej linii w źródło! – shreddd

+0

Dzięki za odpowiedź. Po prostu zauważę, że to dziwne, bo inaczej brakuje mi innego sposobu robienia tego, co chcę. Po prostu chciałbym użyć NamedTemporaryFile tylko po to, abym mógł go wyrzucić, jeśli napotkam na błędy generujące je, ale przenieś je na sukces do pliku, który mógłbym stworzyć w zwykły sposób (nazwa, "w"). Wydaje się podobnie jak prośba o funkcję ... – nealmcb

2

W przypadku może to komuś pomóc, chciałem zrobić mniej więcej to samo, tutaj jest kod użyłem:

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

Właśnie tego chciałem, dziękuję bardzo za drażnienie niskiego poziomu hydrauliki, do której jesteśmy zmuszeni! :) – nealmcb

Powiązane problemy