2011-03-08 238 views
17


我只是試圖處理上傳的文件並將其寫入工作目錄,其名稱是系統時間戳。問題是我想創建具有完全權限的目錄(777),但我不能!使用以下代碼段,創建的目錄擁有755個權限。在Python中使用os.makedirs創建目錄時的權限問題

def handle_uploaded_file(upfile, cTimeStamp): 
    target_dir = "path_to_my_working_dir/tmp_files/%s" % (cTimeStamp) 
    os.makedirs(target_dir, mode=0777) 

任何人都可以幫助我嗎?非常感謝。

+0

你正在得到什麼錯誤? – Ikke 2011-03-08 11:37:44

+0

我只是得到目錄,但具有錯誤的權限(755而不是777)。 – green69 2011-03-08 11:38:56

回答

23

根據官方Python documentationos.makedirs功能模式參數可能在某些系統上被忽略,在哪裏則不能忽略系統當前的umask值被屏蔽掉。

無論哪種方式,您都可以使用os.chmod函數強制模式爲0o777(0777拋出語法錯誤)。

+6

+1:'umask'通常是出現意外權限時的罪魁禍首。 – 2011-03-08 11:45:49

+0

我同意,問題可能是umask - 此診斷可能不正確。 – dbn 2014-05-16 20:37:45

+1

@dbw我傾向於同意,目前的umask設置可能是問題的原因,這就是爲什麼我在我的答案中提到了umask - 在使用chmod描述替代解決方案之前。 – srgerg 2014-05-17 01:31:38

8

對於Unix系統(當模式不被忽略時),提供的模式首先被當前用戶的掩碼爲umask。您還可以修復運行此代碼的用戶的umask。那麼你不必打電話給os.chmod()方法。 請注意,如果您不修復umask並使用os.makedirs方法創建多個目錄,則必須標識創建的文件夾並在其上應用os.chmod

對我來說,我創建了以下功能:

def supermakedirs(path, mode): 
    if not path or os.path.exists(path): 
     return [] 
    (head, tail) = os.path.split(path) 
    res = supermakedirs(head, mode) 
    os.mkdir(path) 
    os.chmod(path, mode) 
    res += [path] 
    return res 
+0

我無法在'/ var /'裏創建'test'目錄。 – 2017-04-24 11:54:43

13

你碰到的問題,因爲os.makedir()榮譽當前進程(see the docs, here)的umask的。如果你想忽略的umask,你就必須做一些這樣的:

import os 
try: 
    original_umask = os.umask(0) 
    os.makedirs('full/path/to/new/directory', desired_permission) 
finally: 
    os.umask(original_umask) 

在你的情況,你要desired_permission0777(八進制,而不是字符串)。大多數其他用戶可能會想要0755或0770.

+1

稍微修正:umask不是文件或目錄的屬性,它是由正在運行的進程設置的。通常umask是從shell繼承而來的。 – Sundae 2016-03-07 12:30:50

+0

謝謝,聖代 - 驗證和更新。 – dbn 2016-03-07 19:31:36

+0

@dbw哇,通過更改umask,事情按預期工作:)但是有沒有這樣做的風險? – user3366706 2016-03-31 23:29:32