Python: 如何在测试套件中创建临时文件?
(我在使用Python 2.6和nose
。)
我正在为我的Python应用写测试。我想要一个测试能够打开一个新文件,关闭它,然后删除它。自然,我希望这个过程发生在一个临时目录里,因为我不想弄乱用户的文件系统。而且,这个方法需要在不同的操作系统上都能用。
我该怎么做呢?
6 个回答
11
与其直接使用tempfile,我建议使用一个上下文管理器来包装它。这个上下文管理器可以在所有情况下(无论成功、失败还是出现异常)自动处理删除目录,基本上不需要额外的代码。
下面是它的使用方法:
from tempfile import TempDir # "tempfile" is a module in the standard library
...
# in some test:
with TempDir() as d:
temp_file_name = os.path.join(d.name, 'your_temp_file.name')
# create file...
# ...
# asserts...
我之前一直在用自己写的版本(实现代码相当短,不到20行),直到我需要在其他地方也使用它,所以我查了一下,发现有一个现成的包可以安装,确实有:tempfile
注意:上面的代码片段有点过时了。
- 在Python 2.7中,有tempfile.mkdtemp
- 在Python 3中,有tempfile.TemporaryDirectory
34
顺便说一下,使用 py.test 你可以这样写:
def test_function(tmpdir):
# tmpdir is a unique-per-test-function invocation temporary directory
每个测试函数如果使用 "tmpdir" 这个参数,就会得到一个干净的空目录。这个目录会被创建在 "/tmp/pytest-NUM" 下面(在 Linux 系统上是这个路径,Windows 系统的路径会不同),其中 NUM 会随着每次测试运行而增加。最后三个目录会被保留,方便你查看,旧的目录会自动删除。你还可以通过 py.test --basetemp=mytmpdir
来设置一个基础的临时目录。
tmpdir 对象是一个 py.path.local 对象,你也可以这样使用:
sub = tmpdir.mkdir("sub")
sub.join("testfile.txt").write("content")
不过把它转换成一个 "字符串" 路径也是可以的:
tmpdir = str(tmpdir)
22
可以看看标准库里的 tempfile 模块,这里面的内容应该能满足你的需求。