Python:生成安全的临时文件名

时间:2014-12-07 14:03:12

标签: python unit-testing standard-library temporary-files

在为后端类编写单元测试的上下文中,我需要一种安全的方法来生成临时文件名。我目前的做法是:

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...

2 个答案:

答案 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 ...