【问题标题】:generate temporary file to replace real file生成临时文件替换真实文件
【发布时间】:2016-02-05 11:13:17
【问题描述】:

我需要生成一个临时文件来用新内容替换系统文件。

我有代码,它可以工作,但我在想是否有一些模块可以自动执行此操作,如下所示:

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')

【问题讨论】:

    标签: python-3.x atomic temporary-files


    【解决方案1】:

    tempfile 中没有这样的上下文管理器,但编写自己的上下文管理器并不难:

    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 方法才能使示例正常工作)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多