2016-02-05 28 views
1

我需要生成一個臨時文件以用新內容替換系統文件。生成臨時文件以替換實際文件

我的代碼,它的作品,但我想,如果有一些模塊,自動這樣做,沿着線:

with tempfile.NamedTemporaryFileFor('/etc/systemfile', delete=False) as fp: 
    ... 

這將創建一個具有相同權限的臨時文件,原始文件的所有者和相同的文件夾中。然後我會寫我的新內容,並用原子替換原來的系統文件。哎呀,上下文管理器可以在文件關閉時爲我做替換!

我當前的代碼是:

with tempfile.NamedTemporaryFile(delete=False, dir='/etc') as fp: 
    tempfilename = fp.name 
    fp.write('my new contents') 

orig_stat = os.stat('/etc/systemfile') 
os.chown(tempfilename, orig_stat.st_uid, orig_stat.st_gid) 
os.chmod(tempfilename, orig_stat.st_mode) 

os.replace(tempfilename, '/etc/systemfile') 

回答

1

有在臨時文件沒有這樣的情況管理器,但它不是太難寫你自己的情況管理器:

class NamedTemporaryFileFor(object): 
    def __init__(self, orig_path, delete=True, dir=None): 
     self.orig_path = orig_path 
     self.named_temp_file = tempfile.NamedTemporaryFile(delete=delete, dir=dir) 

    def __enter__(self): 
     self.named_temp_file.__enter__() 
     return self 

    def write(self, *args, **kwargs): 
     return self.named_temp_file.write(*args, **kwargs) 

    def __exit__(self, exc, value, tb): 
     orig_stat = os.stat(self.orig_path) 
     os.chown(self.named_temp_file.name, orig_stat.st_uid, orig_stat.st_gid) 
     os.chmod(self.named_temp_file.name, orig_stat.st_mode) 

     self.named_temp_file.__exit__(exc, value, tb) 

if __name__ == "__main__": 
    with NamedTemporaryFileFor(sys.argv[1], delete=False, dir="/etc") as fp: 
     f.write(b'my new content') 

(請注意,我有將一個字節字符串傳遞給write方法來使這個例子工作)