我需要生成一个临时文件来替换带有新内容的系统文件。
我有代码,它可以工作,但我在想是否有一些模块会自动执行此操作,如下所示:
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')
答案 0 :(得分: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
方法才能使示例正常工作)