在为后端类编写单元测试的上下文中,我需要一种安全的方法来生成临时文件名。我目前的做法是:
fp = tempfile.NamedTemporaryFile(delete=False)
fp.close()
with Backend(fp.name) as backend:
...run the test...
os.unlink(fp.name)
这有点尴尬。是否存在标准库上下文管理器,它允许通过以下方式实现相同的目的:
with TempFileName() as name:
with Backend(name) as backend:
...run the test...
似乎没有预制的上下文管理器。我现在正在使用:
class TemporaryBackend(object):
def __init__(self):
self.fp = tempfile.NamedTemporaryFile(delete=False)
self.fp.close()
self.backend = Backend(self.fp.name)
def __enter__(self):
return self.backend
def __exit__(self, exc_type, exc_value, traceback):
self.backend.close()
os.unlink(self.fp.name)
然后可以使用:
with TemporaryBackend() as backend:
...run the test...
答案 0 :(得分:1)
创建唯一文件名会中继文件系统授予对文件的独占访问权限的能力。因此,必须创建一个文件,而不仅仅是文件名。
另一种方法是创建临时目录并将文件放在此目录中,以便安全地创建文件。这将是我测试案例的首选方式。
答案 1 :(得分:1)
创建一个只有您有权访问的临时目录,而不是创建临时文件。完成后,您只需使用任意字符串作为该目录中文件的名称。
d = tempfile.mkdtemp()
tmp_name = "somefile.txt"
with Backend(os.path.join(d, tmp_name)) as backend:
... run test ...
os.remove(tmp_name) # If necessary
os.rmdir(d)
根据您的需要,您可能只想要一个随机字符串:
with Backend(''.join(random.sample(string.lowercase, 8))) as backend:
... run test ...