Подтвердить что ты не робот

Python: Как сделать временные файлы в моем наборе тестов?

(Я использую Python 2.6 и nose.)

Я пишу тесты для своего приложения Python. Я хочу, чтобы один тест открыл новый файл, закроет его и удалит. Естественно, я предпочитаю, чтобы это происходило во временном каталоге, потому что я не хочу уничтожать файловую систему пользователя. И это должно быть кросс-OS.

Как мне это сделать?

4b9b3361

Ответ 1

Смотрите модуль tempfile в стандартной библиотеке - все должно быть.

Ответ 2

FWIW, используя py.test, вы можете написать:

def test_function(tmpdir):
    # tmpdir is a unique-per-test-function invocation temporary directory

Каждая тестовая функция с использованием аргумента функции "tmpdir" получит чистый пустой каталог, созданный как подкаталог "/tmp/pytest-NUM" (linux, win32 имеет другой путь), где NUM увеличивается для каждого тестового прогона, Последние три каталога хранятся для облегчения проверки, а старые автоматически удаляются. Вы также можете установить базовый каталог temp с помощью py.test --basetemp=mytmpdir.

Объект tmpdir - это объект py.path.local, который также может использоваться следующим образом:

sub = tmpdir.mkdir("sub")
sub.join("testfile.txt").write("content")

Но это также прекрасно, чтобы просто преобразовать его в "строковый" путь:

tmpdir = str(tmpdir)

Ответ 3

Вместо того, чтобы использовать tempfile, я предлагаю использовать для него оболочку контекстного менеджера - менеджер контекста позаботится об удалении каталога во всех случаев (успех/отказ/исключение), в основном без шаблона.

Вот как это можно использовать:

from tempdir import TempDir
...

# in some test:
with TempDir() as d:
    temp_file_name = os.path.join(d.name, 'your_temp_file.name')
    # create file...
    # ...
    # asserts...

Я использую домашнюю версию (реализация довольно короткая - до 20 строк) до такой степени, когда мне нужно было использовать ее где-то еще, поэтому я огляделся, если есть пакет, готовый к установке, и действительно есть: tempdir