2016-02-05 29 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方法来使这个例子工作)